@flamingo-stack/openframe-frontend-core 0.0.383 → 0.0.384-snapshot.20260708165758

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 (120) hide show
  1. package/dist/{chunk-FL6YJLPC.cjs → chunk-2KDXNL7M.cjs} +7 -7
  2. package/dist/{chunk-FL6YJLPC.cjs.map → chunk-2KDXNL7M.cjs.map} +1 -1
  3. package/dist/{chunk-EGFLSQEJ.js → chunk-53R2NLYW.js} +4 -4
  4. package/dist/{chunk-W456FUZG.cjs → chunk-5I4ERVP4.cjs} +57 -57
  5. package/dist/{chunk-W456FUZG.cjs.map → chunk-5I4ERVP4.cjs.map} +1 -1
  6. package/dist/{chunk-BALSUWWU.cjs → chunk-5O2QED4E.cjs} +37 -37
  7. package/dist/{chunk-BALSUWWU.cjs.map → chunk-5O2QED4E.cjs.map} +1 -1
  8. package/dist/{chunk-EBOK7SG7.js → chunk-7DVZECFW.js} +2 -2
  9. package/dist/{chunk-SGMZQTP6.js → chunk-ACKCFE7D.js} +2 -2
  10. package/dist/{chunk-MY7TV47R.js → chunk-ACYF5YVM.js} +2 -2
  11. package/dist/{chunk-7TU6MLIQ.cjs → chunk-CIBBHSCP.cjs} +12 -12
  12. package/dist/{chunk-7TU6MLIQ.cjs.map → chunk-CIBBHSCP.cjs.map} +1 -1
  13. package/dist/{chunk-ZFIDR55N.cjs → chunk-DN5AIYP4.cjs} +9 -9
  14. package/dist/{chunk-ZFIDR55N.cjs.map → chunk-DN5AIYP4.cjs.map} +1 -1
  15. package/dist/{chunk-AJJF43ZL.js → chunk-IDF4BZHL.js} +2 -2
  16. package/dist/{chunk-6SR7HXGW.js → chunk-K557GA5G.js} +4 -4
  17. package/dist/{chunk-LI7OAUSA.js → chunk-L5FDBXYI.js} +4 -4
  18. package/dist/{chunk-AHCBZ6TC.cjs → chunk-LDOEIJIA.cjs} +62 -62
  19. package/dist/{chunk-AHCBZ6TC.cjs.map → chunk-LDOEIJIA.cjs.map} +1 -1
  20. package/dist/{chunk-WVJFSCXR.cjs → chunk-LFAEFMYA.cjs} +26 -26
  21. package/dist/{chunk-WVJFSCXR.cjs.map → chunk-LFAEFMYA.cjs.map} +1 -1
  22. package/dist/{chunk-S2V4EPKL.cjs → chunk-LRLY7VFQ.cjs} +15 -15
  23. package/dist/{chunk-S2V4EPKL.cjs.map → chunk-LRLY7VFQ.cjs.map} +1 -1
  24. package/dist/{chunk-KBG3PLKS.js → chunk-NTHZI6VG.js} +2 -2
  25. package/dist/{chunk-KQQ6U4UW.js → chunk-PNJXI4NZ.js} +4 -4
  26. package/dist/{chunk-KGSOMSHT.cjs → chunk-QXKQ2WZF.cjs} +25 -25
  27. package/dist/{chunk-KGSOMSHT.cjs.map → chunk-QXKQ2WZF.cjs.map} +1 -1
  28. package/dist/{chunk-B45U4FY5.js → chunk-UPHZGPXZ.js} +2 -2
  29. package/dist/{chunk-VQCV3GGI.cjs → chunk-VZHEFPPH.cjs} +227 -163
  30. package/dist/chunk-VZHEFPPH.cjs.map +1 -0
  31. package/dist/{chunk-YW6K7IYF.cjs → chunk-X5DBARHE.cjs} +31 -31
  32. package/dist/{chunk-YW6K7IYF.cjs.map → chunk-X5DBARHE.cjs.map} +1 -1
  33. package/dist/{chunk-CNDLMBFN.js → chunk-XQ77CK5C.js} +390 -326
  34. package/dist/chunk-XQ77CK5C.js.map +1 -0
  35. package/dist/{chunk-ZD6GZX7E.js → chunk-YDYO7DRL.js} +2 -2
  36. package/dist/{chunk-KFTCNBSJ.cjs → chunk-ZRVWRNVJ.cjs} +5 -5
  37. package/dist/{chunk-KFTCNBSJ.cjs.map → chunk-ZRVWRNVJ.cjs.map} +1 -1
  38. package/dist/components/case-studies/index.cjs +8 -8
  39. package/dist/components/case-studies/index.js +2 -2
  40. package/dist/components/chat/approval-batch-message.d.ts +20 -0
  41. package/dist/components/chat/approval-batch-message.d.ts.map +1 -1
  42. package/dist/components/chat/index.cjs +4 -2
  43. package/dist/components/chat/index.cjs.map +1 -1
  44. package/dist/components/chat/index.js +3 -1
  45. package/dist/components/contact/index.cjs +3 -3
  46. package/dist/components/contact/index.js +2 -2
  47. package/dist/components/docs/index.cjs +5 -5
  48. package/dist/components/docs/index.js +4 -4
  49. package/dist/components/embeds/index.cjs +3 -3
  50. package/dist/components/embeds/index.js +2 -2
  51. package/dist/components/faq/index.cjs +3 -3
  52. package/dist/components/faq/index.js +2 -2
  53. package/dist/components/features/index.cjs +2 -2
  54. package/dist/components/features/index.js +1 -1
  55. package/dist/components/features/notifications/approval-request-notification-tile.d.ts.map +1 -1
  56. package/dist/components/features/notifications/notification-tile.d.ts +8 -2
  57. package/dist/components/features/notifications/notification-tile.d.ts.map +1 -1
  58. package/dist/components/features/notifications/types.d.ts +11 -1
  59. package/dist/components/features/notifications/types.d.ts.map +1 -1
  60. package/dist/components/help-center-pages/index.cjs +20 -20
  61. package/dist/components/help-center-pages/index.js +11 -11
  62. package/dist/components/index.cjs +122 -120
  63. package/dist/components/index.cjs.map +1 -1
  64. package/dist/components/index.js +11 -9
  65. package/dist/components/index.js.map +1 -1
  66. package/dist/components/navigation/app-layout.d.ts +9 -1
  67. package/dist/components/navigation/app-layout.d.ts.map +1 -1
  68. package/dist/components/navigation/index.cjs +2 -2
  69. package/dist/components/navigation/index.js +1 -1
  70. package/dist/components/navigation/navigation-sidebar-item.d.ts.map +1 -1
  71. package/dist/components/navigation/navigation-sidebar.d.ts.map +1 -1
  72. package/dist/components/onboarding-guides/index.cjs +5 -5
  73. package/dist/components/onboarding-guides/index.js +4 -4
  74. package/dist/components/related-content/index.cjs +3 -3
  75. package/dist/components/related-content/index.js +2 -2
  76. package/dist/components/tickets/index.cjs +5 -5
  77. package/dist/components/tickets/index.js +4 -4
  78. package/dist/components/ui/data-table/data-table-body.d.ts +6 -1
  79. package/dist/components/ui/data-table/data-table-body.d.ts.map +1 -1
  80. package/dist/components/ui/data-table/data-table-row.d.ts +7 -1
  81. package/dist/components/ui/data-table/data-table-row.d.ts.map +1 -1
  82. package/dist/components/ui/data-table/index.d.ts +1 -1
  83. package/dist/components/ui/index.cjs +4 -2
  84. package/dist/components/ui/index.cjs.map +1 -1
  85. package/dist/components/ui/index.js +3 -1
  86. package/dist/index.cjs +4 -2
  87. package/dist/index.cjs.map +1 -1
  88. package/dist/index.js +3 -1
  89. package/dist/tailwind.config.cjs +4 -1
  90. package/dist/tailwind.config.cjs.map +1 -1
  91. package/dist/tailwind.config.js +4 -1
  92. package/dist/tailwind.config.js.map +1 -1
  93. package/dist/types/navigation.d.ts +0 -1
  94. package/dist/types/navigation.d.ts.map +1 -1
  95. package/package.json +1 -1
  96. package/src/components/chat/approval-batch-message.tsx +28 -15
  97. package/src/components/features/notifications/approval-request-notification-tile.tsx +70 -46
  98. package/src/components/features/notifications/notification-tile.tsx +125 -41
  99. package/src/components/features/notifications/types.ts +11 -1
  100. package/src/components/navigation/app-layout.tsx +17 -1
  101. package/src/components/navigation/navigation-sidebar-item.tsx +1 -12
  102. package/src/components/navigation/navigation-sidebar.tsx +6 -1
  103. package/src/components/ui/data-table/data-table-body.tsx +7 -0
  104. package/src/components/ui/data-table/data-table-row.tsx +12 -1
  105. package/src/stories/NotificationDrawer.stories.tsx +220 -31
  106. package/src/types/navigation.ts +0 -1
  107. package/tailwind.config.ts +4 -1
  108. package/dist/chunk-CNDLMBFN.js.map +0 -1
  109. package/dist/chunk-VQCV3GGI.cjs.map +0 -1
  110. /package/dist/{chunk-EGFLSQEJ.js.map → chunk-53R2NLYW.js.map} +0 -0
  111. /package/dist/{chunk-EBOK7SG7.js.map → chunk-7DVZECFW.js.map} +0 -0
  112. /package/dist/{chunk-SGMZQTP6.js.map → chunk-ACKCFE7D.js.map} +0 -0
  113. /package/dist/{chunk-MY7TV47R.js.map → chunk-ACYF5YVM.js.map} +0 -0
  114. /package/dist/{chunk-AJJF43ZL.js.map → chunk-IDF4BZHL.js.map} +0 -0
  115. /package/dist/{chunk-6SR7HXGW.js.map → chunk-K557GA5G.js.map} +0 -0
  116. /package/dist/{chunk-LI7OAUSA.js.map → chunk-L5FDBXYI.js.map} +0 -0
  117. /package/dist/{chunk-KBG3PLKS.js.map → chunk-NTHZI6VG.js.map} +0 -0
  118. /package/dist/{chunk-KQQ6U4UW.js.map → chunk-PNJXI4NZ.js.map} +0 -0
  119. /package/dist/{chunk-B45U4FY5.js.map → chunk-UPHZGPXZ.js.map} +0 -0
  120. /package/dist/{chunk-ZD6GZX7E.js.map → chunk-YDYO7DRL.js.map} +0 -0
@@ -281,7 +281,10 @@ var config = {
281
281
  pink: "var(--ods-flamingo-pink-base)",
282
282
  cyan: "var(--ods-flamingo-cyan-base)"
283
283
  },
284
- "open-yellow": "var(--ods-open-yellow-base)",
284
+ "open-yellow": {
285
+ DEFAULT: "var(--ods-open-yellow-base)",
286
+ secondary: "var(--ods-open-yellow-secondary)"
287
+ },
285
288
  // Attention tokens (ods-colors.css). Components reference these BY
286
289
  // NAME (error-state.tsx: `border-ods-attention-red-error` etc.) —
287
290
  // without these mappings Tailwind silently generates NOTHING for
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/tailwindcss/lib/util/createPlugin.js","../node_modules/tailwindcss/lib/public/create-plugin.js","../node_modules/tailwindcss/plugin.js","../tailwind.config.ts"],"names":["plugin","config"],"mappings":"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","file":"tailwind.config.js","sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function() {\n return _default;\n }\n});\nfunction createPlugin(plugin, config) {\n return {\n handler: plugin,\n config\n };\n}\ncreatePlugin.withOptions = function(pluginFunction, configFunction = ()=>({})) {\n const optionsFunction = function(options) {\n return {\n __options: options,\n handler: pluginFunction(options),\n config: configFunction(options)\n };\n };\n optionsFunction.__isOptionsFunction = true;\n // Expose plugin dependencies so that `object-hash` returns a different\n // value if anything here changes, to ensure a rebuild is triggered.\n optionsFunction.__pluginFunction = pluginFunction;\n optionsFunction.__configFunction = configFunction;\n return optionsFunction;\n};\nconst _default = createPlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function() {\n return _default;\n }\n});\nconst _createPlugin = /*#__PURE__*/ _interop_require_default(require(\"../util/createPlugin\"));\nfunction _interop_require_default(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\nconst _default = _createPlugin.default;\n","let createPlugin = require('./lib/public/create-plugin')\nmodule.exports = (createPlugin.__esModule ? createPlugin : { default: createPlugin }).default\n","import type { Config } from 'tailwindcss'\nimport plugin from 'tailwindcss/plugin'\nimport tailwindcssAnimate from 'tailwindcss-animate'\nimport containerQueries from '@tailwindcss/container-queries'\n\nconst odsTypographyPlugin = plugin(({ addUtilities }) => {\n addUtilities({\n '.text-h1': {\n fontFamily: 'var(--font-h1-family)',\n fontWeight: 'var(--font-h1-weight)',\n fontSize: 'var(--font-size-h1-title)',\n lineHeight: 'var(--font-line-space-h1-main-title)',\n letterSpacing: '-0.02em',\n },\n '.text-h2': {\n fontFamily: 'var(--font-h2-family)',\n fontWeight: 'var(--font-h2-weight)',\n fontSize: 'var(--font-size-h2-sub-title)',\n lineHeight: 'var(--font-line-space-h2-sub-title)',\n letterSpacing: '-0.02em',\n },\n '.text-h3': {\n fontFamily: 'var(--font-h3-family)',\n fontWeight: 'var(--font-h3-weight)',\n fontSize: 'var(--font-size-h3-body)',\n lineHeight: 'var(--font-line-space-h3-body)',\n letterSpacing: '-0.02em',\n },\n '.text-h4': {\n fontFamily: 'var(--font-h4-family)',\n fontWeight: 'var(--font-h4-weight)',\n fontSize: 'var(--font-size-h4-body)',\n lineHeight: 'var(--font-line-space-h4-body)',\n },\n '.text-h5': {\n fontFamily: 'var(--font-h5-family)',\n fontWeight: 'var(--font-h5-weight)',\n fontSize: 'var(--font-size-h5-caption)',\n lineHeight: 'var(--font-line-space-h5-caption)',\n textTransform: 'uppercase',\n letterSpacing: '-0.02em',\n },\n '.text-h6': {\n fontFamily: 'var(--font-h6-family)',\n fontWeight: 'var(--font-h6-weight)',\n fontSize: 'var(--font-size-h6-caption)',\n lineHeight: 'var(--font-line-space-h6-caption)',\n },\n })\n})\n\nconst config: Config = {\n content: [\n \"./src/**/*.{js,ts,jsx,tsx}\",\n ],\n safelist: [\n // Dynamically generated classes for table hide/show functionality\n 'hidden',\n 'md:hidden',\n 'lg:hidden',\n 'md:flex',\n 'lg:flex',\n ],\n theme: {\n container: {\n center: true,\n padding: \"2rem\",\n screens: {\n \"2xl\": \"1400px\",\n },\n },\n extend: {\n colors: {\n // Shadcn/ui base colors (keep for compatibility)\n border: \"hsl(var(--border))\",\n input: \"hsl(var(--input))\",\n ring: \"hsl(var(--ring))\",\n background: \"hsl(var(--background))\",\n foreground: \"hsl(var(--foreground))\",\n primary: {\n DEFAULT: \"hsl(var(--primary))\",\n foreground: \"hsl(var(--primary-foreground))\",\n },\n secondary: {\n DEFAULT: \"hsl(var(--secondary))\",\n foreground: \"hsl(var(--secondary-foreground))\",\n },\n destructive: {\n DEFAULT: \"hsl(var(--destructive))\",\n foreground: \"hsl(var(--destructive-foreground))\",\n },\n muted: {\n DEFAULT: \"hsl(var(--muted))\",\n foreground: \"hsl(var(--muted-foreground))\",\n },\n accent: {\n DEFAULT: \"hsl(var(--accent))\",\n foreground: \"hsl(var(--accent-foreground))\",\n },\n popover: {\n DEFAULT: \"hsl(var(--popover))\",\n foreground: \"hsl(var(--popover-foreground))\",\n },\n card: {\n DEFAULT: \"hsl(var(--card))\",\n foreground: \"hsl(var(--card-foreground))\",\n },\n\n // =================================================\n // ODS (Open Design System) COLORS\n // =================================================\n // Single nested structure: generates bg-ods-*, text-ods-*, border-ods-* utilities\n ods: {\n // Backgrounds\n bg: \"var(--color-bg)\",\n card: \"var(--color-bg-card)\",\n overlay: \"var(--color-bg-overlay)\",\n skeleton: \"var(--color-bg-skeleton)\",\n \"bg-hover\": \"var(--color-bg-hover)\",\n \"bg-active\": \"var(--color-bg-active)\",\n \"bg-surface\": \"var(--color-bg-surface)\",\n \"card-hover\": \"var(--color-bg-hover)\",\n divider: \"var(--color-divider)\",\n\n // Borders\n border: {\n DEFAULT: \"var(--color-border-default)\",\n hover: \"var(--color-border-hover)\",\n active: \"var(--color-border-active)\",\n focus: \"var(--color-border-focus)\",\n },\n\n // Text\n text: {\n primary: \"var(--color-text-primary)\",\n secondary: \"var(--color-text-secondary)\",\n tertiary: \"var(--color-text-tertiary)\",\n muted: \"var(--color-text-muted)\",\n subtle: \"var(--color-text-subtle)\",\n disabled: \"var(--color-text-disabled)\",\n \"on-accent\": \"var(--color-text-on-accent)\",\n \"on-dark\": \"var(--color-text-on-dark)\",\n },\n\n // Accent\n accent: {\n DEFAULT: \"var(--color-accent-primary)\",\n hover: \"var(--color-accent-hover)\",\n active: \"var(--color-accent-active)\",\n focus: \"var(--color-accent-focus)\",\n disabled: \"var(--color-accent-disabled)\",\n },\n\n // Status\n success: {\n DEFAULT: \"var(--color-success)\",\n hover: \"var(--color-success-hover)\",\n active: \"var(--color-success-active)\",\n secondary: \"var(--color-success-secondary)\",\n \"secondary-hover\": \"var(--color-success-secondary-hover)\",\n \"secondary-active\": \"var(--color-success-secondary-active)\",\n },\n error: {\n DEFAULT: \"var(--color-error)\",\n hover: \"var(--color-error-hover)\",\n active: \"var(--color-error-active)\",\n secondary: \"var(--color-error-secondary)\",\n \"secondary-hover\": \"var(--color-error-secondary-hover)\",\n \"secondary-active\": \"var(--color-error-secondary-active)\",\n },\n warning: {\n DEFAULT: \"var(--color-warning)\",\n hover: \"var(--color-warning-hover)\",\n active: \"var(--color-warning-active)\",\n secondary: \"var(--color-warning-secondary)\",\n \"secondary-hover\": \"var(--color-warning-secondary-hover)\",\n \"secondary-active\": \"var(--color-warning-secondary-active)\",\n },\n info: {\n DEFAULT: \"var(--color-info)\",\n hover: \"var(--color-info-hover)\",\n active: \"var(--color-info-active)\",\n },\n\n // Interactive states\n disabled: \"var(--color-disabled)\",\n focus: \"var(--color-focus-ring)\",\n \"focus-visible\": \"var(--color-focus-visible)\",\n\n // Links\n link: {\n DEFAULT: \"var(--color-link)\",\n hover: \"var(--color-link-hover)\",\n visited: \"var(--color-link-visited)\",\n },\n\n // Brand colors (theme-independent)\n flamingo: {\n pink: \"var(--ods-flamingo-pink-base)\",\n cyan: \"var(--ods-flamingo-cyan-base)\",\n },\n \"open-yellow\": \"var(--ods-open-yellow-base)\",\n\n // Attention tokens (ods-colors.css). Components reference these BY\n // NAME (error-state.tsx: `border-ods-attention-red-error` etc.) —\n // without these mappings Tailwind silently generates NOTHING for\n // the class and the component renders colorless in every consumer.\n attention: {\n \"red-error\": \"var(--ods-attention-red-error)\",\n \"red-error-hover\": \"var(--ods-attention-red-error-hover)\",\n \"red-error-action\": \"var(--ods-attention-red-error-action)\",\n \"red-error-secondary\": \"var(--ods-attention-red-error-secondary)\",\n \"red-error-secondary-hover\": \"var(--ods-attention-red-error-secondary-hover)\",\n \"red-error-secondary-action\": \"var(--ods-attention-red-error-secondary-action)\",\n \"yellow-warning\": \"var(--ods-attention-yellow-warning)\",\n \"yellow-warning-hover\": \"var(--ods-attention-yellow-warning-hover)\",\n \"yellow-warning-action\": \"var(--ods-attention-yellow-warning-action)\",\n \"yellow-warning-secondary\": \"var(--ods-attention-yellow-warning-secondary)\",\n \"yellow-warning-secondary-hover\": \"var(--ods-attention-yellow-warning-secondary-hover)\",\n \"yellow-warning-secondary-action\": \"var(--ods-attention-yellow-warning-secondary-action)\",\n \"green-success\": \"var(--ods-attention-green-success)\",\n \"green-success-hover\": \"var(--ods-attention-green-success-hover)\",\n \"green-success-action\": \"var(--ods-attention-green-success-action)\",\n \"green-success-secondary\": \"var(--ods-attention-green-success-secondary)\",\n \"green-success-secondary-hover\": \"var(--ods-attention-green-success-secondary-hover)\",\n \"green-success-secondary-action\": \"var(--ods-attention-green-success-secondary-action)\",\n },\n\n // Adaptive platform color\n current: \"var(--ods-current)\",\n },\n },\n // Custom breakpoints (aligned with ODS responsive tokens from Figma)\n screens: {\n 'md': '800px', // Tablet: 50rem\n 'lg': '1280px', // Desktop: 80rem\n 'xl': '1440px', // Large desktop: 90rem\n },\n\n borderRadius: {\n lg: \"var(--radius)\", // 8px\n md: \"calc(var(--radius) - 2px)\", // 6px\n sm: \"calc(var(--radius) - 4px)\", // 4px\n xs: \"calc(var(--radius) - 6px)\", // 2px\n },\n\n maxWidth: {\n 'ods-content-narrow': '600px',\n },\n\n fontFamily: {\n sans: [\"var(--font-family-body)\"],\n mono: [\"var(--font-family-heading)\"],\n body: [\"var(--font-family-body)\"],\n heading: [\"var(--font-family-heading)\"],\n },\n\n // =================================================\n // TYPOGRAPHY\n // =================================================\n fontSize: {\n // Responsive heading sizes (from ods-responsive-tokens.css)\n 'heading-1': ['var(--font-size-h1-title)', { lineHeight: 'var(--font-line-space-h1-main-title)' }],\n 'heading-2': ['var(--font-size-h2-sub-title)', { lineHeight: 'var(--font-line-space-h2-sub-title)' }],\n 'heading-3': ['var(--font-size-h3-body)', { lineHeight: 'var(--font-line-space-h3-body)' }],\n 'heading-4': ['var(--font-size-h4-body)', { lineHeight: 'var(--font-line-space-h4-body)' }],\n 'heading-5': ['var(--font-size-h5-caption)', { lineHeight: 'var(--font-line-space-h5-caption)' }],\n 'heading-6': ['var(--font-size-h6-caption)', { lineHeight: 'var(--font-line-space-h6-caption)' }],\n },\n\n // =================================================\n // SHADOWS\n // =================================================\n boxShadow: {\n 'card': 'var(--shadow-card)',\n 'card-hover': 'var(--shadow-card-hover)',\n 'modal': 'var(--shadow-modal)',\n 'dropdown': 'var(--shadow-dropdown)',\n 'tooltip': 'var(--shadow-tooltip)',\n 'focus': 'var(--shadow-focus)',\n 'accent': 'var(--shadow-accent)',\n 'accent-lg': 'var(--shadow-accent-lg)',\n },\n\n // =================================================\n // TRANSITIONS\n // =================================================\n transitionDuration: {\n 'fast': 'var(--duration-fast)',\n 'normal': 'var(--duration-normal)',\n 'slow': 'var(--duration-slow)',\n 'slower': 'var(--duration-slower)',\n },\n transitionTimingFunction: {\n 'bounce': 'var(--ease-bounce)',\n 'elastic': 'var(--ease-elastic)',\n },\n\n // =================================================\n // Z-INDEX\n // =================================================\n zIndex: {\n 'dropdown': 'var(--z-dropdown)',\n 'sticky': 'var(--z-sticky)',\n 'fixed': 'var(--z-fixed)',\n 'modal-backdrop': 'var(--z-modal-backdrop)',\n 'modal': 'var(--z-modal)',\n 'popover': 'var(--z-popover)',\n 'tooltip': 'var(--z-tooltip)',\n 'notification': 'var(--z-notification)',\n 'debug': 'var(--z-debug)',\n },\n\n // =================================================\n // ANIMATIONS\n // =================================================\n keyframes: {\n \"accordion-down\": {\n from: { height: \"0\" },\n to: { height: \"var(--radix-accordion-content-height)\" },\n },\n \"accordion-up\": {\n from: { height: \"var(--radix-accordion-content-height)\" },\n to: { height: \"0\" },\n },\n \"fade-in\": {\n from: { opacity: \"0\" },\n to: { opacity: \"1\" },\n },\n // Endless chip strip (QuickActionMarquee): the track renders its items\n // twice, so -50% lands exactly one copy over for a seamless loop.\n \"qa-marquee\": {\n from: { transform: \"translateX(0)\" },\n to: { transform: \"translateX(-50%)\" },\n },\n },\n animation: {\n \"accordion-down\": \"accordion-down 0.2s ease-out\",\n \"accordion-up\": \"accordion-up 0.2s ease-out\",\n \"fade-in\": \"fade-in 0.3s ease-out\",\n \"qa-marquee\": \"qa-marquee var(--qa-marquee-duration,40s) linear infinite\",\n },\n },\n },\n plugins: [tailwindcssAnimate, odsTypographyPlugin, containerQueries],\n}\n\nexport default config\n"]}
1
+ {"version":3,"sources":["../node_modules/tailwindcss/lib/util/createPlugin.js","../node_modules/tailwindcss/lib/public/create-plugin.js","../node_modules/tailwindcss/plugin.js","../tailwind.config.ts"],"names":["plugin","config"],"mappings":"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","file":"tailwind.config.js","sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function() {\n return _default;\n }\n});\nfunction createPlugin(plugin, config) {\n return {\n handler: plugin,\n config\n };\n}\ncreatePlugin.withOptions = function(pluginFunction, configFunction = ()=>({})) {\n const optionsFunction = function(options) {\n return {\n __options: options,\n handler: pluginFunction(options),\n config: configFunction(options)\n };\n };\n optionsFunction.__isOptionsFunction = true;\n // Expose plugin dependencies so that `object-hash` returns a different\n // value if anything here changes, to ensure a rebuild is triggered.\n optionsFunction.__pluginFunction = pluginFunction;\n optionsFunction.__configFunction = configFunction;\n return optionsFunction;\n};\nconst _default = createPlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"default\", {\n enumerable: true,\n get: function() {\n return _default;\n }\n});\nconst _createPlugin = /*#__PURE__*/ _interop_require_default(require(\"../util/createPlugin\"));\nfunction _interop_require_default(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\nconst _default = _createPlugin.default;\n","let createPlugin = require('./lib/public/create-plugin')\nmodule.exports = (createPlugin.__esModule ? createPlugin : { default: createPlugin }).default\n","import type { Config } from 'tailwindcss'\nimport plugin from 'tailwindcss/plugin'\nimport tailwindcssAnimate from 'tailwindcss-animate'\nimport containerQueries from '@tailwindcss/container-queries'\n\nconst odsTypographyPlugin = plugin(({ addUtilities }) => {\n addUtilities({\n '.text-h1': {\n fontFamily: 'var(--font-h1-family)',\n fontWeight: 'var(--font-h1-weight)',\n fontSize: 'var(--font-size-h1-title)',\n lineHeight: 'var(--font-line-space-h1-main-title)',\n letterSpacing: '-0.02em',\n },\n '.text-h2': {\n fontFamily: 'var(--font-h2-family)',\n fontWeight: 'var(--font-h2-weight)',\n fontSize: 'var(--font-size-h2-sub-title)',\n lineHeight: 'var(--font-line-space-h2-sub-title)',\n letterSpacing: '-0.02em',\n },\n '.text-h3': {\n fontFamily: 'var(--font-h3-family)',\n fontWeight: 'var(--font-h3-weight)',\n fontSize: 'var(--font-size-h3-body)',\n lineHeight: 'var(--font-line-space-h3-body)',\n letterSpacing: '-0.02em',\n },\n '.text-h4': {\n fontFamily: 'var(--font-h4-family)',\n fontWeight: 'var(--font-h4-weight)',\n fontSize: 'var(--font-size-h4-body)',\n lineHeight: 'var(--font-line-space-h4-body)',\n },\n '.text-h5': {\n fontFamily: 'var(--font-h5-family)',\n fontWeight: 'var(--font-h5-weight)',\n fontSize: 'var(--font-size-h5-caption)',\n lineHeight: 'var(--font-line-space-h5-caption)',\n textTransform: 'uppercase',\n letterSpacing: '-0.02em',\n },\n '.text-h6': {\n fontFamily: 'var(--font-h6-family)',\n fontWeight: 'var(--font-h6-weight)',\n fontSize: 'var(--font-size-h6-caption)',\n lineHeight: 'var(--font-line-space-h6-caption)',\n },\n })\n})\n\nconst config: Config = {\n content: [\n \"./src/**/*.{js,ts,jsx,tsx}\",\n ],\n safelist: [\n // Dynamically generated classes for table hide/show functionality\n 'hidden',\n 'md:hidden',\n 'lg:hidden',\n 'md:flex',\n 'lg:flex',\n ],\n theme: {\n container: {\n center: true,\n padding: \"2rem\",\n screens: {\n \"2xl\": \"1400px\",\n },\n },\n extend: {\n colors: {\n // Shadcn/ui base colors (keep for compatibility)\n border: \"hsl(var(--border))\",\n input: \"hsl(var(--input))\",\n ring: \"hsl(var(--ring))\",\n background: \"hsl(var(--background))\",\n foreground: \"hsl(var(--foreground))\",\n primary: {\n DEFAULT: \"hsl(var(--primary))\",\n foreground: \"hsl(var(--primary-foreground))\",\n },\n secondary: {\n DEFAULT: \"hsl(var(--secondary))\",\n foreground: \"hsl(var(--secondary-foreground))\",\n },\n destructive: {\n DEFAULT: \"hsl(var(--destructive))\",\n foreground: \"hsl(var(--destructive-foreground))\",\n },\n muted: {\n DEFAULT: \"hsl(var(--muted))\",\n foreground: \"hsl(var(--muted-foreground))\",\n },\n accent: {\n DEFAULT: \"hsl(var(--accent))\",\n foreground: \"hsl(var(--accent-foreground))\",\n },\n popover: {\n DEFAULT: \"hsl(var(--popover))\",\n foreground: \"hsl(var(--popover-foreground))\",\n },\n card: {\n DEFAULT: \"hsl(var(--card))\",\n foreground: \"hsl(var(--card-foreground))\",\n },\n\n // =================================================\n // ODS (Open Design System) COLORS\n // =================================================\n // Single nested structure: generates bg-ods-*, text-ods-*, border-ods-* utilities\n ods: {\n // Backgrounds\n bg: \"var(--color-bg)\",\n card: \"var(--color-bg-card)\",\n overlay: \"var(--color-bg-overlay)\",\n skeleton: \"var(--color-bg-skeleton)\",\n \"bg-hover\": \"var(--color-bg-hover)\",\n \"bg-active\": \"var(--color-bg-active)\",\n \"bg-surface\": \"var(--color-bg-surface)\",\n \"card-hover\": \"var(--color-bg-hover)\",\n divider: \"var(--color-divider)\",\n\n // Borders\n border: {\n DEFAULT: \"var(--color-border-default)\",\n hover: \"var(--color-border-hover)\",\n active: \"var(--color-border-active)\",\n focus: \"var(--color-border-focus)\",\n },\n\n // Text\n text: {\n primary: \"var(--color-text-primary)\",\n secondary: \"var(--color-text-secondary)\",\n tertiary: \"var(--color-text-tertiary)\",\n muted: \"var(--color-text-muted)\",\n subtle: \"var(--color-text-subtle)\",\n disabled: \"var(--color-text-disabled)\",\n \"on-accent\": \"var(--color-text-on-accent)\",\n \"on-dark\": \"var(--color-text-on-dark)\",\n },\n\n // Accent\n accent: {\n DEFAULT: \"var(--color-accent-primary)\",\n hover: \"var(--color-accent-hover)\",\n active: \"var(--color-accent-active)\",\n focus: \"var(--color-accent-focus)\",\n disabled: \"var(--color-accent-disabled)\",\n },\n\n // Status\n success: {\n DEFAULT: \"var(--color-success)\",\n hover: \"var(--color-success-hover)\",\n active: \"var(--color-success-active)\",\n secondary: \"var(--color-success-secondary)\",\n \"secondary-hover\": \"var(--color-success-secondary-hover)\",\n \"secondary-active\": \"var(--color-success-secondary-active)\",\n },\n error: {\n DEFAULT: \"var(--color-error)\",\n hover: \"var(--color-error-hover)\",\n active: \"var(--color-error-active)\",\n secondary: \"var(--color-error-secondary)\",\n \"secondary-hover\": \"var(--color-error-secondary-hover)\",\n \"secondary-active\": \"var(--color-error-secondary-active)\",\n },\n warning: {\n DEFAULT: \"var(--color-warning)\",\n hover: \"var(--color-warning-hover)\",\n active: \"var(--color-warning-active)\",\n secondary: \"var(--color-warning-secondary)\",\n \"secondary-hover\": \"var(--color-warning-secondary-hover)\",\n \"secondary-active\": \"var(--color-warning-secondary-active)\",\n },\n info: {\n DEFAULT: \"var(--color-info)\",\n hover: \"var(--color-info-hover)\",\n active: \"var(--color-info-active)\",\n },\n\n // Interactive states\n disabled: \"var(--color-disabled)\",\n focus: \"var(--color-focus-ring)\",\n \"focus-visible\": \"var(--color-focus-visible)\",\n\n // Links\n link: {\n DEFAULT: \"var(--color-link)\",\n hover: \"var(--color-link-hover)\",\n visited: \"var(--color-link-visited)\",\n },\n\n // Brand colors (theme-independent)\n flamingo: {\n pink: \"var(--ods-flamingo-pink-base)\",\n cyan: \"var(--ods-flamingo-cyan-base)\",\n },\n \"open-yellow\": {\n DEFAULT: \"var(--ods-open-yellow-base)\",\n secondary: \"var(--ods-open-yellow-secondary)\",\n },\n\n // Attention tokens (ods-colors.css). Components reference these BY\n // NAME (error-state.tsx: `border-ods-attention-red-error` etc.) —\n // without these mappings Tailwind silently generates NOTHING for\n // the class and the component renders colorless in every consumer.\n attention: {\n \"red-error\": \"var(--ods-attention-red-error)\",\n \"red-error-hover\": \"var(--ods-attention-red-error-hover)\",\n \"red-error-action\": \"var(--ods-attention-red-error-action)\",\n \"red-error-secondary\": \"var(--ods-attention-red-error-secondary)\",\n \"red-error-secondary-hover\": \"var(--ods-attention-red-error-secondary-hover)\",\n \"red-error-secondary-action\": \"var(--ods-attention-red-error-secondary-action)\",\n \"yellow-warning\": \"var(--ods-attention-yellow-warning)\",\n \"yellow-warning-hover\": \"var(--ods-attention-yellow-warning-hover)\",\n \"yellow-warning-action\": \"var(--ods-attention-yellow-warning-action)\",\n \"yellow-warning-secondary\": \"var(--ods-attention-yellow-warning-secondary)\",\n \"yellow-warning-secondary-hover\": \"var(--ods-attention-yellow-warning-secondary-hover)\",\n \"yellow-warning-secondary-action\": \"var(--ods-attention-yellow-warning-secondary-action)\",\n \"green-success\": \"var(--ods-attention-green-success)\",\n \"green-success-hover\": \"var(--ods-attention-green-success-hover)\",\n \"green-success-action\": \"var(--ods-attention-green-success-action)\",\n \"green-success-secondary\": \"var(--ods-attention-green-success-secondary)\",\n \"green-success-secondary-hover\": \"var(--ods-attention-green-success-secondary-hover)\",\n \"green-success-secondary-action\": \"var(--ods-attention-green-success-secondary-action)\",\n },\n\n // Adaptive platform color\n current: \"var(--ods-current)\",\n },\n },\n // Custom breakpoints (aligned with ODS responsive tokens from Figma)\n screens: {\n 'md': '800px', // Tablet: 50rem\n 'lg': '1280px', // Desktop: 80rem\n 'xl': '1440px', // Large desktop: 90rem\n },\n\n borderRadius: {\n lg: \"var(--radius)\", // 8px\n md: \"calc(var(--radius) - 2px)\", // 6px\n sm: \"calc(var(--radius) - 4px)\", // 4px\n xs: \"calc(var(--radius) - 6px)\", // 2px\n },\n\n maxWidth: {\n 'ods-content-narrow': '600px',\n },\n\n fontFamily: {\n sans: [\"var(--font-family-body)\"],\n mono: [\"var(--font-family-heading)\"],\n body: [\"var(--font-family-body)\"],\n heading: [\"var(--font-family-heading)\"],\n },\n\n // =================================================\n // TYPOGRAPHY\n // =================================================\n fontSize: {\n // Responsive heading sizes (from ods-responsive-tokens.css)\n 'heading-1': ['var(--font-size-h1-title)', { lineHeight: 'var(--font-line-space-h1-main-title)' }],\n 'heading-2': ['var(--font-size-h2-sub-title)', { lineHeight: 'var(--font-line-space-h2-sub-title)' }],\n 'heading-3': ['var(--font-size-h3-body)', { lineHeight: 'var(--font-line-space-h3-body)' }],\n 'heading-4': ['var(--font-size-h4-body)', { lineHeight: 'var(--font-line-space-h4-body)' }],\n 'heading-5': ['var(--font-size-h5-caption)', { lineHeight: 'var(--font-line-space-h5-caption)' }],\n 'heading-6': ['var(--font-size-h6-caption)', { lineHeight: 'var(--font-line-space-h6-caption)' }],\n },\n\n // =================================================\n // SHADOWS\n // =================================================\n boxShadow: {\n 'card': 'var(--shadow-card)',\n 'card-hover': 'var(--shadow-card-hover)',\n 'modal': 'var(--shadow-modal)',\n 'dropdown': 'var(--shadow-dropdown)',\n 'tooltip': 'var(--shadow-tooltip)',\n 'focus': 'var(--shadow-focus)',\n 'accent': 'var(--shadow-accent)',\n 'accent-lg': 'var(--shadow-accent-lg)',\n },\n\n // =================================================\n // TRANSITIONS\n // =================================================\n transitionDuration: {\n 'fast': 'var(--duration-fast)',\n 'normal': 'var(--duration-normal)',\n 'slow': 'var(--duration-slow)',\n 'slower': 'var(--duration-slower)',\n },\n transitionTimingFunction: {\n 'bounce': 'var(--ease-bounce)',\n 'elastic': 'var(--ease-elastic)',\n },\n\n // =================================================\n // Z-INDEX\n // =================================================\n zIndex: {\n 'dropdown': 'var(--z-dropdown)',\n 'sticky': 'var(--z-sticky)',\n 'fixed': 'var(--z-fixed)',\n 'modal-backdrop': 'var(--z-modal-backdrop)',\n 'modal': 'var(--z-modal)',\n 'popover': 'var(--z-popover)',\n 'tooltip': 'var(--z-tooltip)',\n 'notification': 'var(--z-notification)',\n 'debug': 'var(--z-debug)',\n },\n\n // =================================================\n // ANIMATIONS\n // =================================================\n keyframes: {\n \"accordion-down\": {\n from: { height: \"0\" },\n to: { height: \"var(--radix-accordion-content-height)\" },\n },\n \"accordion-up\": {\n from: { height: \"var(--radix-accordion-content-height)\" },\n to: { height: \"0\" },\n },\n \"fade-in\": {\n from: { opacity: \"0\" },\n to: { opacity: \"1\" },\n },\n // Endless chip strip (QuickActionMarquee): the track renders its items\n // twice, so -50% lands exactly one copy over for a seamless loop.\n \"qa-marquee\": {\n from: { transform: \"translateX(0)\" },\n to: { transform: \"translateX(-50%)\" },\n },\n },\n animation: {\n \"accordion-down\": \"accordion-down 0.2s ease-out\",\n \"accordion-up\": \"accordion-up 0.2s ease-out\",\n \"fade-in\": \"fade-in 0.3s ease-out\",\n \"qa-marquee\": \"qa-marquee var(--qa-marquee-duration,40s) linear infinite\",\n },\n },\n },\n plugins: [tailwindcssAnimate, odsTypographyPlugin, containerQueries],\n}\n\nexport default config\n"]}
@@ -88,7 +88,6 @@ export interface NavigationSidebarItem {
88
88
  label: string;
89
89
  icon: React.ReactNode;
90
90
  path?: string;
91
- badge?: string | React.ReactNode;
92
91
  unreadCount?: number;
93
92
  isActive?: boolean;
94
93
  onClick?: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/types/navigation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/types/navigation.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flamingo-stack/openframe-frontend-core",
3
- "version": "0.0.383",
3
+ "version": "0.0.384-snapshot.20260708165758",
4
4
  "description": "Shared design system and components for all Flamingo platforms",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -47,29 +47,42 @@ export interface ApprovalBatchMessageProps extends React.HTMLAttributes<HTMLDivE
47
47
  * full-text status pill); `'mingo'`/undefined = admin (original layout).
48
48
  */
49
49
  assistantType?: AssistantType
50
+ /**
51
+ * Render the footer Approve/Reject buttons (or the resolved-status tag).
52
+ * Turn off when the host owns the actions row — e.g. the approval
53
+ * notification tile. Explanation bullets still render.
54
+ */
55
+ showFooterActions?: boolean
50
56
  }
51
57
 
52
58
  const COMMAND_BODY_KEYS = new Set<string>(COMMAND_BODY_ARG_KEYS)
53
59
 
60
+ export interface ApprovalStatusTagProps {
61
+ status: ApprovalBatchSegment["status"]
62
+ resolvedByName?: string | null
63
+ inlineResolver?: boolean
64
+ }
65
+
54
66
  /**
55
67
  * Terminal-status badge for a resolved approval batch (approved / rejected /
56
- * cancelled). For CLIENT (Fae) the resolver's name is baked into the tag as a
57
- * single full-text pill ("Approved by {name}"); ADMIN keeps the compact word
58
- * and renders "by {name}" as a separate muted span in the footer.
68
+ * cancelled); renders nothing while pending. With `inlineResolver` the
69
+ * resolver's name is baked into the tag as a single full-text pill
70
+ * ("Approved by {name}"); otherwise callers render "by {name}" as a separate
71
+ * muted span. Also used by the approval notification tile, which hosts the
72
+ * actions row itself (`showFooterActions={false}`).
59
73
  */
60
- function renderStatusTag(
61
- status: ApprovalBatchSegment["status"],
62
- isClient: boolean,
63
- resolvedByName?: string | null,
64
- ) {
65
- const suffix = isClient && resolvedByName ? ` by ${resolvedByName}` : ""
74
+ export function ApprovalStatusTag({ status, resolvedByName, inlineResolver = false }: ApprovalStatusTagProps) {
75
+ const suffix = inlineResolver && resolvedByName ? ` by ${resolvedByName}` : ""
66
76
  if (status === "approved") {
67
77
  return <Tag label={`Approved${suffix}`} variant="success" icon={<CheckCircleIcon className="w-4 h-4" />} />
68
78
  }
69
79
  if (status === "cancelled") {
70
80
  return <Tag label={`Canceled${suffix}`} variant="grey" icon={<XmarkIcon className="w-4 h-4" />} />
71
81
  }
72
- return <Tag label={`Rejected${suffix}`} variant="error" icon={<XmarkCircleIcon className="w-4 h-4" />} />
82
+ if (status === "rejected") {
83
+ return <Tag label={`Rejected${suffix}`} variant="error" icon={<XmarkCircleIcon className="w-4 h-4" />} />
84
+ }
85
+ return null
73
86
  }
74
87
 
75
88
  function getArgEntries(call: PendingToolCallData): Array<[string, unknown]> {
@@ -193,7 +206,7 @@ function ToolCallRow({ call, expanded, onToggle, batchStatus, execution, showExe
193
206
  }
194
207
 
195
208
  const ApprovalBatchMessage = forwardRef<HTMLDivElement, ApprovalBatchMessageProps>(
196
- ({ className, data, onApprove, onReject, status = "pending", maxBodyHeight, resolvedByName, showExecutionStatus = true, assistantType, ...props }, ref) => {
209
+ ({ className, data, onApprove, onReject, status = "pending", maxBodyHeight, resolvedByName, showExecutionStatus = true, assistantType, showFooterActions = true, ...props }, ref) => {
197
210
  const [expandedId, setExpandedId] = useState<string | null>(null)
198
211
  const [isProcessing, setIsProcessing] = useState(false)
199
212
  const isClient = assistantType === "fae"
@@ -223,7 +236,7 @@ const ApprovalBatchMessage = forwardRef<HTMLDivElement, ApprovalBatchMessageProp
223
236
  }
224
237
  }
225
238
 
226
- const showFooterBlock = explanations.length > 0 || status !== undefined
239
+ const showFooterBlock = explanations.length > 0 || showFooterActions
227
240
 
228
241
  return (
229
242
  <div
@@ -282,7 +295,7 @@ const ApprovalBatchMessage = forwardRef<HTMLDivElement, ApprovalBatchMessageProp
282
295
  </ul>
283
296
  )}
284
297
 
285
- {status === "pending" ? (
298
+ {showFooterActions && (status === "pending" ? (
286
299
  <div className="flex gap-[var(--spacing-system-xsf)] items-center">
287
300
  <Button
288
301
  size="small-legacy"
@@ -313,12 +326,12 @@ const ApprovalBatchMessage = forwardRef<HTMLDivElement, ApprovalBatchMessageProp
313
326
  </div>
314
327
  ) : (
315
328
  <div className="flex items-center gap-[var(--spacing-system-xsf)]">
316
- {renderStatusTag(status, isClient, resolvedByName)}
329
+ <ApprovalStatusTag status={status} resolvedByName={resolvedByName} inlineResolver={isClient} />
317
330
  {!isClient && resolvedByName && (
318
331
  <span className="text-h6 text-ods-text-secondary">by {resolvedByName}</span>
319
332
  )}
320
333
  </div>
321
- )}
334
+ ))}
322
335
  </div>
323
336
  )}
324
337
  </div>
@@ -1,8 +1,8 @@
1
1
  'use client'
2
2
 
3
3
  import { useMemo, useState } from 'react'
4
- import { cn } from '../../../utils/cn'
5
- import { ApprovalBatchMessage } from '../../chat/approval-batch-message'
4
+ import { Button } from '../../ui/button'
5
+ import { ApprovalBatchMessage, ApprovalStatusTag } from '../../chat/approval-batch-message'
6
6
  import { ExpandChevron } from '../../chat/expand-chevron'
7
7
  import { useCollapsible } from '../../chat/hooks/use-collapsible'
8
8
  import type { ChatApprovalStatus } from '../../chat/types'
@@ -35,6 +35,7 @@ export function ApprovalRequestNotificationTile({
35
35
  // Toggling the command section pins the tile so a live pop-up doesn't
36
36
  // auto-dismiss out from under the user mid-read.
37
37
  const [pinned, setPinned] = useState(defaultExpanded)
38
+ const [processing, setProcessing] = useState(false)
38
39
  // Optimistic status for this user's own click; backend resolution (below) wins once it arrives.
39
40
  const [localStatus, setLocalStatus] = useState<ChatApprovalStatus | null>(null)
40
41
 
@@ -48,66 +49,89 @@ export function ApprovalRequestNotificationTile({
48
49
 
49
50
  if (!approval || !batchData) return null
50
51
 
51
- const commandWord = batchData.toolCalls.length > 1 ? 'Commands' : 'Command'
52
- const toggleLabel = `${expanded ? 'Hide' : 'Show'} ${commandWord}`
52
+ const tileNotification: Notification = {
53
+ ...notification,
54
+ type: notification.type ?? 'Approval Required',
55
+ }
56
+
57
+ const commandWord = batchData.toolCalls.length > 1 ? 'commands' : 'command'
58
+ const toggleLabel = `${expanded ? 'Hide' : 'Show'} ${commandWord} section`
53
59
 
54
- const handleApprove = async () => {
55
- setLocalStatus('approved')
60
+ const resolve = async (
61
+ nextStatus: 'approved' | 'rejected',
62
+ action: (approvalRequestId: string) => void | Promise<void>,
63
+ ) => {
64
+ setProcessing(true)
65
+ setLocalStatus(nextStatus)
56
66
  try {
57
- await onApprove(batchData.approvalRequestId)
58
- onComplete(notification.id)
67
+ await action(batchData.approvalRequestId)
59
68
  } catch {
60
69
  setLocalStatus(null) // roll back the optimistic flip; the request failed
70
+ return
71
+ } finally {
72
+ setProcessing(false)
61
73
  }
62
- }
63
- const handleReject = async () => {
64
- setLocalStatus('rejected')
65
- try {
66
- await onReject(batchData.approvalRequestId)
67
- onComplete(notification.id)
68
- } catch {
69
- setLocalStatus(null)
70
- }
74
+ // Outside the try: a throwing consumer callback must not roll back a request
75
+ // that already succeeded server-side.
76
+ onComplete(notification.id)
71
77
  }
72
78
 
73
79
  return (
74
80
  <NotificationTile
75
- notification={notification}
81
+ notification={tileNotification}
76
82
  liveDurationMs={liveDurationMs}
77
83
  onComplete={onComplete}
78
84
  onSettle={onSettle}
79
85
  className={className}
80
- paused={pinned}
86
+ paused={pinned || processing}
87
+ actions={
88
+ <div className="flex w-full items-center gap-[var(--spacing-system-xs)]">
89
+ {status === 'pending' ? (
90
+ <>
91
+ <Button variant="accent" size="small" onClick={() => resolve('approved', onApprove)} disabled={processing}>
92
+ Approve
93
+ </Button>
94
+ <Button variant="outline" size="small" onClick={() => resolve('rejected', onReject)} disabled={processing}>
95
+ Reject
96
+ </Button>
97
+ </>
98
+ ) : (
99
+ <span className="flex min-w-0 items-center gap-[var(--spacing-system-xsf)]">
100
+ <ApprovalStatusTag status={status} />
101
+ {approval.resolvedByName ? (
102
+ <span className="truncate text-h6 text-ods-text-secondary">by {approval.resolvedByName}</span>
103
+ ) : null}
104
+ </span>
105
+ )}
106
+ <Button
107
+ variant="outline"
108
+ size="small"
109
+ onClick={() => {
110
+ setExpanded(prev => !prev)
111
+ setPinned(true)
112
+ }}
113
+ aria-expanded={expanded}
114
+ aria-label={toggleLabel}
115
+ className="ml-auto w-6 shrink-0 px-0 md:w-8"
116
+ >
117
+ <ExpandChevron expanded={expanded} />
118
+ </Button>
119
+ </div>
120
+ }
81
121
  >
82
- {/* Persistent collapse/expand control for the command section. */}
83
- <button
84
- type="button"
85
- onClick={() => {
86
- setExpanded(prev => !prev)
87
- setPinned(true)
88
- }}
89
- aria-expanded={expanded}
90
- className={cn(
91
- 'flex w-full items-center gap-[var(--spacing-system-xs)] bg-ods-card px-[var(--spacing-system-s)] py-[var(--spacing-system-xs)] text-left',
92
- expanded && 'border-b border-ods-border',
93
- )}
94
- >
95
- <span className="min-w-0 flex-1 text-h6 text-ods-text-primary">{toggleLabel}</span>
96
- <ExpandChevron expanded={expanded} />
97
- </button>
98
-
99
122
  <div style={containerStyle}>
123
+ {/* Divider lives inside the measured element — useCollapsible caps the
124
+ container at the inner scrollHeight, which excludes the inner's own borders. */}
100
125
  <div ref={innerRef}>
101
- <ApprovalBatchMessage
102
- data={batchData}
103
- status={status}
104
- resolvedByName={approval.resolvedByName}
105
- showExecutionStatus={false}
106
- onApprove={handleApprove}
107
- onReject={handleReject}
108
- maxBodyHeight="50vh"
109
- className="mb-0 rounded-none border-0"
110
- />
126
+ <div className="border-t border-ods-border">
127
+ <ApprovalBatchMessage
128
+ data={batchData}
129
+ showExecutionStatus={false}
130
+ showFooterActions={false}
131
+ maxBodyHeight="50vh"
132
+ className="mb-0 rounded-none border-0"
133
+ />
134
+ </div>
111
135
  </div>
112
136
  </div>
113
137
  </NotificationTile>
@@ -1,12 +1,32 @@
1
1
  'use client'
2
2
 
3
- import { useMemo, useEffect, type ReactNode } from 'react'
3
+ import { useMemo, useEffect, useState, type ReactNode } from 'react'
4
4
  import { CheckCircleIcon } from '../../icons-v2-generated/signs-and-symbols/check-circle-icon'
5
5
  import { XmarkIcon } from '../../icons-v2-generated/signs-and-symbols/xmark-icon'
6
- import { Button } from '../../ui/button/button'
7
6
  import { dotColorByVariant, progressColorByVariant } from '../../ui/toaster'
8
7
  import { cn } from '../../../utils/cn'
9
- import type { Notification } from './types'
8
+ import { formatTicketRelativeTime } from '../../../utils/date-utils'
9
+ import type { Notification, NotificationSeverity, NotificationVariant } from './types'
10
+
11
+ /** Backend severity → tile color variant; overrides `notification.variant` when present. */
12
+ const variantBySeverity: Record<NotificationSeverity, NotificationVariant> = {
13
+ INFO: 'info',
14
+ SUCCESS: 'success',
15
+ WARNING: 'warning',
16
+ DANGER: 'error',
17
+ }
18
+
19
+ /** Severity color applied to the header type label and icon slot. */
20
+ const typeColorByVariant: Record<NotificationVariant, string> = {
21
+ default: 'text-ods-text-secondary',
22
+ info: 'text-ods-text-secondary',
23
+ success: 'text-ods-success',
24
+ warning: 'text-ods-warning',
25
+ error: 'text-ods-error',
26
+ }
27
+
28
+ const headerControlClass =
29
+ 'absolute inset-0 flex items-center justify-center text-ods-text-secondary transition-opacity duration-200 hover:text-ods-text-primary'
10
30
 
11
31
  export interface NotificationTileProps {
12
32
  notification: Notification
@@ -14,7 +34,13 @@ export interface NotificationTileProps {
14
34
  onComplete: (id: string) => void
15
35
  onSettle?: (id: string) => void
16
36
  className?: string
17
- /** Extra content rendered below the header inside the same card (e.g. an approval command section). */
37
+ /** Action row rendered below the body inside the padded section (e.g. approval buttons). */
38
+ actions?: ReactNode
39
+ /**
40
+ * Extra content rendered below the padded section (e.g. a collapsible approval command
41
+ * section). Bring your own top divider — the tile no longer draws one, so a zero-height
42
+ * collapsed child doesn't leave a stray border above the card's bottom edge.
43
+ */
18
44
  children?: ReactNode
19
45
  /** Pin the tile: cancel the live auto-dismiss countdown (timer + progress bar) without settling it. */
20
46
  paused?: boolean
@@ -26,10 +52,36 @@ export function NotificationTile({
26
52
  onComplete,
27
53
  onSettle,
28
54
  className,
55
+ actions,
29
56
  children,
30
57
  paused = false,
31
58
  }: NotificationTileProps) {
32
- const { id, variant = 'default', title, description, createdAt, read, settled } = notification
59
+ const {
60
+ id,
61
+ variant = 'default',
62
+ severity,
63
+ type,
64
+ icon,
65
+ imageUrl,
66
+ title,
67
+ description,
68
+ createdAt,
69
+ read,
70
+ settled,
71
+ } = notification
72
+
73
+ // Unknown severity strings (backend data can outrun the union) degrade to `variant`.
74
+ const accentVariant = (severity ? variantBySeverity[severity] : undefined) ?? variant
75
+
76
+ // A blocked/broken image (ad-blockers routinely kill external avatars) falls
77
+ // through to the icon/category/dot chain instead of a broken-image glyph.
78
+ const [failedImageUrl, setFailedImageUrl] = useState<string | null>(null)
79
+ const image = imageUrl && imageUrl !== failedImageUrl ? imageUrl : undefined
80
+
81
+ // Gate on the Date, not the number: NaN, Infinity AND finite-but-out-of-range
82
+ // epochs (e.g. nanoseconds) all make toISOString() throw.
83
+ const createdAtDate = new Date(createdAt)
84
+ const createdAtIso = Number.isNaN(createdAtDate.getTime()) ? null : createdAtDate.toISOString()
33
85
 
34
86
  const initialElapsed = useMemo(() => Date.now() - createdAt, [createdAt])
35
87
  const isLive = !read && !settled && initialElapsed < liveDurationMs
@@ -53,43 +105,89 @@ export function NotificationTile({
53
105
  >
54
106
  <div
55
107
  className={cn(
56
- 'relative flex items-center gap-[var(--spacing-system-xs)] p-[var(--spacing-system-s)]',
57
- children ? 'border-b border-ods-border' : null,
108
+ 'relative flex flex-col gap-[var(--spacing-system-xs)] p-[var(--spacing-system-s)]',
109
+ isLive && 'pb-[var(--spacing-system-m)]',
58
110
  )}
59
111
  >
60
- <div className="flex size-6 shrink-0 items-center justify-center">
61
- <span className={cn('size-1.5 rounded-full', dotColorByVariant[variant])} />
112
+ {/* Header: icon/image + type label (both severity-colored) + time + dismiss/complete control. */}
113
+ <div className="flex items-center gap-[var(--spacing-system-xs)]">
114
+ <span
115
+ className={cn(
116
+ 'flex size-4 shrink-0 items-center justify-center',
117
+ typeColorByVariant[accentVariant],
118
+ )}
119
+ >
120
+ {image ? (
121
+ <img
122
+ src={image}
123
+ alt=""
124
+ onError={() => setFailedImageUrl(image)}
125
+ className="size-4 rounded-[2px] object-cover"
126
+ />
127
+ ) : (
128
+ icon ?? <span className={cn('size-1.5 rounded-full', dotColorByVariant[accentVariant])} />
129
+ )}
130
+ </span>
131
+
132
+ {type ? (
133
+ <p
134
+ className={cn('min-w-0 flex-1 truncate text-h5', typeColorByVariant[accentVariant])}
135
+ title={type}
136
+ >
137
+ {type}
138
+ </p>
139
+ ) : (
140
+ <span className="min-w-0 flex-1" />
141
+ )}
142
+
143
+ {!isLive && createdAtIso ? (
144
+ <time
145
+ dateTime={createdAtIso}
146
+ className="shrink-0 whitespace-nowrap text-h6 text-ods-text-secondary"
147
+ >
148
+ {formatTicketRelativeTime(createdAtIso)}
149
+ </time>
150
+ ) : null}
151
+
152
+ {/* Live X and settled check swap in the same 16px slot; the inactive
153
+ one is removed from the a11y tree and disabled, not just faded. */}
154
+ <span className="relative size-4 shrink-0">
155
+ {[
156
+ { active: isLive, label: 'Dismiss notification', icon: <XmarkIcon size={16} />, onClick: () => onSettle?.(id) },
157
+ { active: !isLive, label: 'Mark notification complete', icon: <CheckCircleIcon size={16} />, onClick: () => onComplete(id) },
158
+ ].map(({ active, label, icon, onClick }) => (
159
+ <button
160
+ key={label}
161
+ type="button"
162
+ onClick={onClick}
163
+ aria-label={label}
164
+ aria-hidden={!active}
165
+ disabled={!active}
166
+ tabIndex={active ? 0 : -1}
167
+ className={cn(headerControlClass, !active && 'pointer-events-none opacity-0')}
168
+ >
169
+ {icon}
170
+ </button>
171
+ ))}
172
+ </span>
62
173
  </div>
63
174
 
64
- <div className="flex min-w-0 flex-1 flex-col">
175
+ <div className="flex min-w-0 flex-col">
65
176
  {title ? <p className="truncate text-h4 text-ods-text-primary" title={typeof title === 'string' ? title : undefined}>{title}</p> : null}
66
177
  {description ? (
67
- <p className="text-h6 line-clamp-2 text-ods-text-secondary" title={typeof description === 'string' ? description : undefined}>{description}</p>
178
+ <p className="text-h6 line-clamp-3 text-ods-text-secondary" title={typeof description === 'string' ? description : undefined}>{description}</p>
68
179
  ) : null}
69
180
  </div>
70
181
 
71
- {/* Settled action. */}
72
- <Button
73
- variant="outline"
74
- size="small"
75
- onClick={() => onComplete(id)}
76
- aria-label="Mark notification complete"
77
- tabIndex={isLive ? -1 : 0}
78
- className={cn(
79
- 'shrink-0 hover:text-ods-text-primary',
80
- isLive && 'invisible',
81
- )}
82
- >
83
- <CheckCircleIcon />
84
- </Button>
182
+ {actions}
85
183
 
86
- {/* Progress sits at the header's bottom edge (above any children). */}
184
+ {/* Progress sits at the section's bottom edge (above any children). */}
87
185
  {counting ? (
88
186
  <div
89
187
  aria-hidden
90
188
  className={cn(
91
189
  'absolute inset-x-0 -bottom-px h-1 origin-left',
92
- progressColorByVariant[variant],
190
+ progressColorByVariant[accentVariant],
93
191
  )}
94
192
  style={{
95
193
  animation: `toast-progress ${liveDurationMs}ms linear forwards`,
@@ -100,20 +198,6 @@ export function NotificationTile({
100
198
  </div>
101
199
 
102
200
  {children}
103
-
104
- {/* Live-only bare X overlay */}
105
- <button
106
- type="button"
107
- onClick={() => onSettle?.(id)}
108
- aria-label="Dismiss notification"
109
- tabIndex={isLive ? 0 : -1}
110
- className={cn(
111
- 'absolute right-[var(--spacing-system-xsf)] top-[var(--spacing-system-xsf)] flex size-4 items-center justify-center text-ods-text-secondary transition-opacity duration-200 hover:text-ods-text-primary',
112
- !isLive && 'pointer-events-none opacity-0',
113
- )}
114
- >
115
- <XmarkIcon size={16} />
116
- </button>
117
201
  </output>
118
202
  )
119
203
  }