@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.
- package/dist/{chunk-FL6YJLPC.cjs → chunk-2KDXNL7M.cjs} +7 -7
- package/dist/{chunk-FL6YJLPC.cjs.map → chunk-2KDXNL7M.cjs.map} +1 -1
- package/dist/{chunk-EGFLSQEJ.js → chunk-53R2NLYW.js} +4 -4
- package/dist/{chunk-W456FUZG.cjs → chunk-5I4ERVP4.cjs} +57 -57
- package/dist/{chunk-W456FUZG.cjs.map → chunk-5I4ERVP4.cjs.map} +1 -1
- package/dist/{chunk-BALSUWWU.cjs → chunk-5O2QED4E.cjs} +37 -37
- package/dist/{chunk-BALSUWWU.cjs.map → chunk-5O2QED4E.cjs.map} +1 -1
- package/dist/{chunk-EBOK7SG7.js → chunk-7DVZECFW.js} +2 -2
- package/dist/{chunk-SGMZQTP6.js → chunk-ACKCFE7D.js} +2 -2
- package/dist/{chunk-MY7TV47R.js → chunk-ACYF5YVM.js} +2 -2
- package/dist/{chunk-7TU6MLIQ.cjs → chunk-CIBBHSCP.cjs} +12 -12
- package/dist/{chunk-7TU6MLIQ.cjs.map → chunk-CIBBHSCP.cjs.map} +1 -1
- package/dist/{chunk-ZFIDR55N.cjs → chunk-DN5AIYP4.cjs} +9 -9
- package/dist/{chunk-ZFIDR55N.cjs.map → chunk-DN5AIYP4.cjs.map} +1 -1
- package/dist/{chunk-AJJF43ZL.js → chunk-IDF4BZHL.js} +2 -2
- package/dist/{chunk-6SR7HXGW.js → chunk-K557GA5G.js} +4 -4
- package/dist/{chunk-LI7OAUSA.js → chunk-L5FDBXYI.js} +4 -4
- package/dist/{chunk-AHCBZ6TC.cjs → chunk-LDOEIJIA.cjs} +62 -62
- package/dist/{chunk-AHCBZ6TC.cjs.map → chunk-LDOEIJIA.cjs.map} +1 -1
- package/dist/{chunk-WVJFSCXR.cjs → chunk-LFAEFMYA.cjs} +26 -26
- package/dist/{chunk-WVJFSCXR.cjs.map → chunk-LFAEFMYA.cjs.map} +1 -1
- package/dist/{chunk-S2V4EPKL.cjs → chunk-LRLY7VFQ.cjs} +15 -15
- package/dist/{chunk-S2V4EPKL.cjs.map → chunk-LRLY7VFQ.cjs.map} +1 -1
- package/dist/{chunk-KBG3PLKS.js → chunk-NTHZI6VG.js} +2 -2
- package/dist/{chunk-KQQ6U4UW.js → chunk-PNJXI4NZ.js} +4 -4
- package/dist/{chunk-KGSOMSHT.cjs → chunk-QXKQ2WZF.cjs} +25 -25
- package/dist/{chunk-KGSOMSHT.cjs.map → chunk-QXKQ2WZF.cjs.map} +1 -1
- package/dist/{chunk-B45U4FY5.js → chunk-UPHZGPXZ.js} +2 -2
- package/dist/{chunk-VQCV3GGI.cjs → chunk-VZHEFPPH.cjs} +227 -163
- package/dist/chunk-VZHEFPPH.cjs.map +1 -0
- package/dist/{chunk-YW6K7IYF.cjs → chunk-X5DBARHE.cjs} +31 -31
- package/dist/{chunk-YW6K7IYF.cjs.map → chunk-X5DBARHE.cjs.map} +1 -1
- package/dist/{chunk-CNDLMBFN.js → chunk-XQ77CK5C.js} +390 -326
- package/dist/chunk-XQ77CK5C.js.map +1 -0
- package/dist/{chunk-ZD6GZX7E.js → chunk-YDYO7DRL.js} +2 -2
- package/dist/{chunk-KFTCNBSJ.cjs → chunk-ZRVWRNVJ.cjs} +5 -5
- package/dist/{chunk-KFTCNBSJ.cjs.map → chunk-ZRVWRNVJ.cjs.map} +1 -1
- package/dist/components/case-studies/index.cjs +8 -8
- package/dist/components/case-studies/index.js +2 -2
- package/dist/components/chat/approval-batch-message.d.ts +20 -0
- package/dist/components/chat/approval-batch-message.d.ts.map +1 -1
- package/dist/components/chat/index.cjs +4 -2
- package/dist/components/chat/index.cjs.map +1 -1
- package/dist/components/chat/index.js +3 -1
- package/dist/components/contact/index.cjs +3 -3
- package/dist/components/contact/index.js +2 -2
- package/dist/components/docs/index.cjs +5 -5
- package/dist/components/docs/index.js +4 -4
- package/dist/components/embeds/index.cjs +3 -3
- package/dist/components/embeds/index.js +2 -2
- package/dist/components/faq/index.cjs +3 -3
- package/dist/components/faq/index.js +2 -2
- package/dist/components/features/index.cjs +2 -2
- package/dist/components/features/index.js +1 -1
- package/dist/components/features/notifications/approval-request-notification-tile.d.ts.map +1 -1
- package/dist/components/features/notifications/notification-tile.d.ts +8 -2
- package/dist/components/features/notifications/notification-tile.d.ts.map +1 -1
- package/dist/components/features/notifications/types.d.ts +11 -1
- package/dist/components/features/notifications/types.d.ts.map +1 -1
- package/dist/components/help-center-pages/index.cjs +20 -20
- package/dist/components/help-center-pages/index.js +11 -11
- package/dist/components/index.cjs +122 -120
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +11 -9
- package/dist/components/index.js.map +1 -1
- package/dist/components/navigation/app-layout.d.ts +9 -1
- package/dist/components/navigation/app-layout.d.ts.map +1 -1
- package/dist/components/navigation/index.cjs +2 -2
- package/dist/components/navigation/index.js +1 -1
- package/dist/components/navigation/navigation-sidebar-item.d.ts.map +1 -1
- package/dist/components/navigation/navigation-sidebar.d.ts.map +1 -1
- package/dist/components/onboarding-guides/index.cjs +5 -5
- package/dist/components/onboarding-guides/index.js +4 -4
- package/dist/components/related-content/index.cjs +3 -3
- package/dist/components/related-content/index.js +2 -2
- package/dist/components/tickets/index.cjs +5 -5
- package/dist/components/tickets/index.js +4 -4
- package/dist/components/ui/data-table/data-table-body.d.ts +6 -1
- package/dist/components/ui/data-table/data-table-body.d.ts.map +1 -1
- package/dist/components/ui/data-table/data-table-row.d.ts +7 -1
- package/dist/components/ui/data-table/data-table-row.d.ts.map +1 -1
- package/dist/components/ui/data-table/index.d.ts +1 -1
- package/dist/components/ui/index.cjs +4 -2
- package/dist/components/ui/index.cjs.map +1 -1
- package/dist/components/ui/index.js +3 -1
- package/dist/index.cjs +4 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -1
- package/dist/tailwind.config.cjs +4 -1
- package/dist/tailwind.config.cjs.map +1 -1
- package/dist/tailwind.config.js +4 -1
- package/dist/tailwind.config.js.map +1 -1
- package/dist/types/navigation.d.ts +0 -1
- package/dist/types/navigation.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/chat/approval-batch-message.tsx +28 -15
- package/src/components/features/notifications/approval-request-notification-tile.tsx +70 -46
- package/src/components/features/notifications/notification-tile.tsx +125 -41
- package/src/components/features/notifications/types.ts +11 -1
- package/src/components/navigation/app-layout.tsx +17 -1
- package/src/components/navigation/navigation-sidebar-item.tsx +1 -12
- package/src/components/navigation/navigation-sidebar.tsx +6 -1
- package/src/components/ui/data-table/data-table-body.tsx +7 -0
- package/src/components/ui/data-table/data-table-row.tsx +12 -1
- package/src/stories/NotificationDrawer.stories.tsx +220 -31
- package/src/types/navigation.ts +0 -1
- package/tailwind.config.ts +4 -1
- package/dist/chunk-CNDLMBFN.js.map +0 -1
- package/dist/chunk-VQCV3GGI.cjs.map +0 -1
- /package/dist/{chunk-EGFLSQEJ.js.map → chunk-53R2NLYW.js.map} +0 -0
- /package/dist/{chunk-EBOK7SG7.js.map → chunk-7DVZECFW.js.map} +0 -0
- /package/dist/{chunk-SGMZQTP6.js.map → chunk-ACKCFE7D.js.map} +0 -0
- /package/dist/{chunk-MY7TV47R.js.map → chunk-ACYF5YVM.js.map} +0 -0
- /package/dist/{chunk-AJJF43ZL.js.map → chunk-IDF4BZHL.js.map} +0 -0
- /package/dist/{chunk-6SR7HXGW.js.map → chunk-K557GA5G.js.map} +0 -0
- /package/dist/{chunk-LI7OAUSA.js.map → chunk-L5FDBXYI.js.map} +0 -0
- /package/dist/{chunk-KBG3PLKS.js.map → chunk-NTHZI6VG.js.map} +0 -0
- /package/dist/{chunk-KQQ6U4UW.js.map → chunk-PNJXI4NZ.js.map} +0 -0
- /package/dist/{chunk-B45U4FY5.js.map → chunk-UPHZGPXZ.js.map} +0 -0
- /package/dist/{chunk-ZD6GZX7E.js.map → chunk-YDYO7DRL.js.map} +0 -0
package/dist/tailwind.config.js
CHANGED
|
@@ -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":
|
|
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"]}
|
|
@@ -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
|
@@ -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)
|
|
57
|
-
*
|
|
58
|
-
*
|
|
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
|
|
61
|
-
|
|
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
|
-
|
|
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 ||
|
|
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
|
-
{
|
|
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 {
|
|
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
|
|
52
|
-
|
|
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
|
|
55
|
-
|
|
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
|
|
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
|
-
|
|
64
|
-
|
|
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={
|
|
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
|
-
<
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
|
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
|
-
/**
|
|
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 {
|
|
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
|
|
57
|
-
|
|
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
|
-
|
|
61
|
-
|
|
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-
|
|
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-
|
|
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
|
-
{
|
|
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
|
|
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[
|
|
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
|
}
|