@fluid-app/portal-sdk 0.1.369 → 0.1.371
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/{CardWidget-CqdJHxX0.cjs → CardWidget-BWwI1G0Z.cjs} +2 -2
- package/dist/{CardWidget-CqdJHxX0.cjs.map → CardWidget-BWwI1G0Z.cjs.map} +1 -1
- package/dist/{CardWidget-DCrXorb0.cjs → CardWidget-aJYbzWG9.cjs} +2 -2
- package/dist/{CardWidget-DdV1HDy0.mjs → CardWidget-cIc9cOG9.mjs} +2 -2
- package/dist/{CardWidget-DdV1HDy0.mjs.map → CardWidget-cIc9cOG9.mjs.map} +1 -1
- package/dist/{ContainerWidget-CYIOGpgy.cjs → ContainerWidget-C2LMzXVj.cjs} +3 -3
- package/dist/{ContainerWidget-CZTRim0A.cjs → ContainerWidget-bMMdFhLg.cjs} +2 -2
- package/dist/{ContainerWidget-CZTRim0A.cjs.map → ContainerWidget-bMMdFhLg.cjs.map} +1 -1
- package/dist/{ContainerWidget-BKaiiPlW.mjs → ContainerWidget-mSWihekF.mjs} +2 -2
- package/dist/{ContainerWidget-BKaiiPlW.mjs.map → ContainerWidget-mSWihekF.mjs.map} +1 -1
- package/dist/{EmbedWidget-B18Qzd0T.cjs → EmbedWidget-CFqodi8C.cjs} +2 -1
- package/dist/{EmbedWidget-CoZgo8aI.cjs → EmbedWidget-D1lbYjuL.cjs} +300 -3
- package/dist/EmbedWidget-D1lbYjuL.cjs.map +1 -0
- package/dist/{EmbedWidget-BJY7l4pI.mjs → EmbedWidget-p_Ybl0em.mjs} +300 -3
- package/dist/EmbedWidget-p_Ybl0em.mjs.map +1 -0
- package/dist/{FluidProvider-iStLA04k.cjs → FluidProvider-C6d1TUVm.cjs} +10 -12
- package/dist/{FluidProvider-iStLA04k.cjs.map → FluidProvider-C6d1TUVm.cjs.map} +1 -1
- package/dist/{FluidProvider-DIhrcma3.mjs → FluidProvider-C80gc4Yi.mjs} +10 -12
- package/dist/{FluidProvider-DIhrcma3.mjs.map → FluidProvider-C80gc4Yi.mjs.map} +1 -1
- package/dist/{LayoutWidget-xw1zY6cc.cjs → LayoutWidget-BqUbneWw.cjs} +2 -2
- package/dist/{LayoutWidget-xw1zY6cc.cjs.map → LayoutWidget-BqUbneWw.cjs.map} +1 -1
- package/dist/{LayoutWidget-VU6uFW3-.cjs → LayoutWidget-C1BzDeQI.cjs} +2 -2
- package/dist/{LayoutWidget-C0TbnxQW.mjs → LayoutWidget-D3qYKt9F.mjs} +2 -2
- package/dist/{LayoutWidget-C0TbnxQW.mjs.map → LayoutWidget-D3qYKt9F.mjs.map} +1 -1
- package/dist/{MessagingScreen-BFpKQppV.mjs → MessagingScreen-D3si8TPx.mjs} +7 -7
- package/dist/{MessagingScreen-BOAnKE3v.mjs → MessagingScreen-DKzYThAY.mjs} +2 -2
- package/dist/{MessagingScreen-BOAnKE3v.mjs.map → MessagingScreen-DKzYThAY.mjs.map} +1 -1
- package/dist/{MessagingScreen-y_A92ivV.cjs → MessagingScreen-DqxRu2x3.cjs} +2 -2
- package/dist/{MessagingScreen-y_A92ivV.cjs.map → MessagingScreen-DqxRu2x3.cjs.map} +1 -1
- package/dist/{MessagingScreen-C5Pejtlt.cjs → MessagingScreen-PZyO11S1.cjs} +7 -7
- package/dist/{OrdersScreen-BzibsZC0.mjs → OrdersScreen-B2htbQ2Q.mjs} +2 -2
- package/dist/{OrdersScreen-BzibsZC0.mjs.map → OrdersScreen-B2htbQ2Q.mjs.map} +1 -1
- package/dist/{OrdersScreen-BlYerRr0.cjs → OrdersScreen-BuX5aWgx.cjs} +7 -7
- package/dist/{OrdersScreen-wtdmNSwV.mjs → OrdersScreen-Cgjfo2Fs.mjs} +7 -7
- package/dist/{OrdersScreen-B_jWMXAy.cjs → OrdersScreen-CpNvxRDC.cjs} +2 -2
- package/dist/{OrdersScreen-B_jWMXAy.cjs.map → OrdersScreen-CpNvxRDC.cjs.map} +1 -1
- package/dist/{ProfileScreen-B5bNfcEX.mjs → ProfileScreen-BCwdwO_p.mjs} +3 -3
- package/dist/{ProfileScreen-B5bNfcEX.mjs.map → ProfileScreen-BCwdwO_p.mjs.map} +1 -1
- package/dist/{ProfileScreen-CUEECEVi.mjs → ProfileScreen-D7UA604p.mjs} +8 -8
- package/dist/{ProfileScreen-BF7Xp0EB.cjs → ProfileScreen-DlIXDIeu.cjs} +3 -3
- package/dist/{ProfileScreen-BF7Xp0EB.cjs.map → ProfileScreen-DlIXDIeu.cjs.map} +1 -1
- package/dist/{ProfileScreen-DXaE0EJ2.cjs → ProfileScreen-MypXufrO.cjs} +8 -8
- package/dist/{ScreenRenderer-CKu-Jc1I.mjs → ScreenRenderer-CcT_j-WQ.mjs} +1 -4
- package/dist/{ScreenRenderer-CKu-Jc1I.mjs.map → ScreenRenderer-CcT_j-WQ.mjs.map} +1 -1
- package/dist/{ScreenRenderer-CZTdJd2G.cjs → ScreenRenderer-Ce8MJPnR.cjs} +1 -4
- package/dist/{ScreenRenderer-CZTdJd2G.cjs.map → ScreenRenderer-Ce8MJPnR.cjs.map} +1 -1
- package/dist/{ShopScreen-CTdqSSs6.cjs → ShopScreen-29SZwMWF.cjs} +2 -2
- package/dist/{ShopScreen-CTdqSSs6.cjs.map → ShopScreen-29SZwMWF.cjs.map} +1 -1
- package/dist/{ShopScreen-CIXdmZvI.cjs → ShopScreen-BC9NDysQ.cjs} +7 -7
- package/dist/{ShopScreen-CUQtjHcp.mjs → ShopScreen-BKVNW6ya.mjs} +7 -7
- package/dist/{ShopScreen-ChWVG5vG.mjs → ShopScreen-CgN-6gic.mjs} +2 -2
- package/dist/{ShopScreen-ChWVG5vG.mjs.map → ShopScreen-CgN-6gic.mjs.map} +1 -1
- package/dist/{SubscriptionsScreen-CXrorIz1.mjs → SubscriptionsScreen-CPiLzWhm.mjs} +8 -8
- package/dist/{SubscriptionsScreen-C8Oc4iYz.cjs → SubscriptionsScreen-Dz6Y_1oD.cjs} +3 -3
- package/dist/{SubscriptionsScreen-C8Oc4iYz.cjs.map → SubscriptionsScreen-Dz6Y_1oD.cjs.map} +1 -1
- package/dist/{SubscriptionsScreen-CwH8QyDm.mjs → SubscriptionsScreen-M2WaVHH7.mjs} +3 -3
- package/dist/{SubscriptionsScreen-CwH8QyDm.mjs.map → SubscriptionsScreen-M2WaVHH7.mjs.map} +1 -1
- package/dist/{SubscriptionsScreen-_X2bwjKO.cjs → SubscriptionsScreen-dN42J-MR.cjs} +8 -8
- package/dist/{authoring-BlXhd4Sj.d.cts → authoring--rXPyZca.d.cts} +2 -2
- package/dist/{authoring-BlXhd4Sj.d.cts.map → authoring--rXPyZca.d.cts.map} +1 -1
- package/dist/{authoring-BMuHXNFy.d.mts → authoring-V0sXg_j4.d.mts} +2 -2
- package/dist/{authoring-BMuHXNFy.d.mts.map → authoring-V0sXg_j4.d.mts.map} +1 -1
- package/dist/index.cjs +23 -25
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -8
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +19 -9
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +23 -25
- package/dist/index.mjs.map +1 -1
- package/dist/preview/preview-entry.cjs +7 -7
- package/dist/preview/preview-entry.d.cts +1 -1
- package/dist/preview/preview-entry.d.mts +1 -1
- package/dist/preview/preview-entry.mjs +7 -7
- package/dist/{use-portal-card-add-3ds-flow-DJoxmO7y.cjs → use-portal-card-add-3ds-flow-C0YUg213.cjs} +2 -2
- package/dist/{use-portal-card-add-3ds-flow-DJoxmO7y.cjs.map → use-portal-card-add-3ds-flow-C0YUg213.cjs.map} +1 -1
- package/dist/{use-portal-card-add-3ds-flow-CKkPV6zg.mjs → use-portal-card-add-3ds-flow-DKXraYw-.mjs} +2 -2
- package/dist/{use-portal-card-add-3ds-flow-CKkPV6zg.mjs.map → use-portal-card-add-3ds-flow-DKXraYw-.mjs.map} +1 -1
- package/dist/vite/builder-preview-entry.cjs +573 -0
- package/dist/vite/builder-preview-entry.cjs.map +1 -0
- package/dist/vite/builder-preview-entry.d.cts +11 -0
- package/dist/vite/builder-preview-entry.d.cts.map +1 -0
- package/dist/vite/builder-preview-entry.d.mts +11 -0
- package/dist/vite/builder-preview-entry.d.mts.map +1 -0
- package/dist/vite/builder-preview-entry.mjs +571 -0
- package/dist/vite/builder-preview-entry.mjs.map +1 -0
- package/dist/vite/index.cjs +16 -28
- package/dist/vite/index.cjs.map +1 -1
- package/dist/vite/index.d.cts.map +1 -1
- package/dist/vite/index.d.mts.map +1 -1
- package/dist/vite/index.mjs +16 -28
- package/dist/vite/index.mjs.map +1 -1
- package/dist/{widget-package-descriptor-BnVCE5Fz.d.cts → widget-package-descriptor-ByCz_FNh.d.cts} +177 -9
- package/dist/widget-package-descriptor-ByCz_FNh.d.cts.map +1 -0
- package/dist/{widget-package-descriptor-Dt8BkF85.d.mts → widget-package-descriptor-CPIPAdUO.d.mts} +177 -9
- package/dist/widget-package-descriptor-CPIPAdUO.d.mts.map +1 -0
- package/dist/widget-package-utils-BWn56ZFw.cjs +1553 -0
- package/dist/widget-package-utils-BWn56ZFw.cjs.map +1 -0
- package/dist/widget-package-utils-BdS0B0pI.mjs +1486 -0
- package/dist/widget-package-utils-BdS0B0pI.mjs.map +1 -0
- package/dist/widgets/authoring.d.cts +1 -1
- package/dist/widgets/authoring.d.mts +1 -1
- package/package.json +17 -21
- package/dist/EmbedWidget-BJY7l4pI.mjs.map +0 -1
- package/dist/EmbedWidget-CoZgo8aI.cjs.map +0 -1
- package/dist/widget-package-descriptor-BnVCE5Fz.d.cts.map +0 -1
- package/dist/widget-package-descriptor-Dt8BkF85.d.mts.map +0 -1
- package/dist/widget-package-utils-BkrdrNr7.mjs +0 -582
- package/dist/widget-package-utils-BkrdrNr7.mjs.map +0 -1
- package/dist/widget-package-utils-C00ijCm-.cjs +0 -650
- package/dist/widget-package-utils-C00ijCm-.cjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require("./chunk-9hOWP6kD.cjs");
|
|
2
|
-
const require_ScreenRenderer = require("./ScreenRenderer-
|
|
2
|
+
const require_ScreenRenderer = require("./ScreenRenderer-Ce8MJPnR.cjs");
|
|
3
3
|
const require_registries = require("./registries-DiCQ4oFx.cjs");
|
|
4
4
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
5
5
|
//#region ../widgets/src/widgets/CardWidget.tsx
|
|
@@ -194,4 +194,4 @@ Object.defineProperty(exports, "cardWidgetPropertySchema", {
|
|
|
194
194
|
}
|
|
195
195
|
});
|
|
196
196
|
|
|
197
|
-
//# sourceMappingURL=CardWidget-
|
|
197
|
+
//# sourceMappingURL=CardWidget-BWwI1G0Z.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CardWidget-CqdJHxX0.cjs","names":["useRegistry","ScreenRenderer","useScreenRenderer","DefaultScreenRenderer","gapValues","borderWidthClasses","borderColorClasses","getFontSizeField","getColorField","getPaddingField","getBorderRadiusField","getBorderWidthField","getBorderColorField","getGapField"],"sources":["../../widgets/src/widgets/CardWidget.tsx"],"sourcesContent":["import { ScreenRenderer as DefaultScreenRenderer } from \"../core/ScreenRenderer\";\nimport { useRegistry } from \"../contexts/RegistryContext\";\nimport { useScreenRenderer } from \"../contexts/ScreenRendererContext\";\nimport type {\n WidgetSchema,\n BackgroundValue,\n BorderRadiusOptions,\n BorderWidthOptions,\n PaddingOptions,\n GapOptions,\n ColorOptions,\n FontSizeOptions,\n} from \"@fluid-app/portal-core/types\";\nimport type React from \"react\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport {\n getBorderRadiusField,\n getBorderWidthField,\n getBorderColorField,\n getColorField,\n getFontSizeField,\n getGapField,\n getPaddingField,\n gapValues,\n borderWidthClasses,\n borderColorClasses,\n} from \"../core/fields\";\n\nconst DEFAULT_BACKGROUND: BackgroundValue = {\n type: \"solid\",\n color: \"background\",\n};\nconst DEFAULT_CHILDREN: (WidgetSchema | null)[] = [];\n\ntype CardWidgetProps = {\n // Header\n headerEnabled?: boolean;\n title?: string;\n titleFontSize?: FontSizeOptions;\n titleColor?: ColorOptions;\n headerBackground?: ColorOptions;\n\n // Footer\n footerEnabled?: boolean;\n footerContent?: string;\n footerColor?: ColorOptions;\n footerBackground?: ColorOptions;\n\n // Styling\n background?: BackgroundValue;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n borderWidth?: BorderWidthOptions;\n borderColor?: ColorOptions;\n /** @deprecated Use borderWidth instead */\n borderEnabled?: boolean;\n gapSize?: GapOptions;\n\n // Container props (children = other widgets)\n children?: (WidgetSchema | null)[];\n\n // Styling\n className?: string;\n};\n\nexport function CardWidget({\n // Header\n headerEnabled = true,\n title = \"Card Title\",\n titleFontSize = \"lg\",\n titleColor = \"foreground\",\n headerBackground = \"transparent\",\n\n // Footer\n footerEnabled = false,\n footerContent = \"\",\n footerColor = \"muted\",\n footerBackground = \"transparent\",\n\n // Styling\n background = DEFAULT_BACKGROUND,\n padding = 6,\n borderRadius = \"xl\",\n borderWidth = \"thin\",\n borderColor = \"muted\",\n borderEnabled,\n gapSize = \"md\",\n\n // Container\n children = DEFAULT_CHILDREN,\n\n className = \"\",\n}: CardWidgetProps): React.JSX.Element {\n // Get registry from context if not provided as prop\n const contextRegistry = useRegistry();\n\n // Use ScreenRenderer from context, fall back to local\n const ContextScreenRenderer = useScreenRenderer();\n const ScreenRenderer = ContextScreenRenderer ?? DefaultScreenRenderer;\n\n // Extract background values\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n\n const gapSizeValue = gapSize ? gapValues[gapSize] : 4;\n\n // Backwards compatibility: if legacy borderEnabled prop exists, map it\n const effectiveBorderWidth = borderEnabled === false ? \"none\" : borderWidth;\n\n const cardClasses = [\n \"flex flex-col gap-6\",\n `bg-${backgroundColor}`,\n `p-${padding}`,\n `rounded-${borderRadius}`,\n borderWidthClasses[effectiveBorderWidth],\n effectiveBorderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const containerStyle: React.CSSProperties = {\n backgroundImage,\n };\n\n // Filter out null children\n const validChildren = children.filter(\n (child): child is WidgetSchema => child !== null,\n );\n\n return (\n <div data-slot=\"card\" className={cardClasses} style={containerStyle}>\n {headerEnabled && (title || headerBackground !== \"transparent\") && (\n <div\n data-slot=\"card-header\"\n className={\n headerBackground !== \"transparent\"\n ? `bg-${headerBackground} -mx-${padding} -mt-${padding} px-${padding} py-${padding} rounded-t-${borderRadius}`\n : undefined\n }\n >\n {title && (\n <div\n data-slot=\"card-title\"\n className={`text-${titleFontSize} text-${titleColor} font-header leading-none font-semibold`}\n >\n {title}\n </div>\n )}\n </div>\n )}\n\n <div data-slot=\"card-content\" className=\"@container flex-1\">\n {contextRegistry ? (\n <ScreenRenderer\n screen={validChildren}\n registry={contextRegistry}\n className={`flex flex-col gap-${gapSizeValue}`}\n />\n ) : (\n <div className={`flex flex-col gap-${gapSizeValue}`} />\n )}\n </div>\n\n {footerEnabled && footerContent && (\n <div\n data-slot=\"card-footer\"\n className={[\n `text-sm text-${footerColor} flex items-center`,\n footerBackground !== \"transparent\"\n ? `bg-${footerBackground} -mx-${padding} -mb-${padding} px-${padding} py-${padding} rounded-b-${borderRadius}`\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {footerContent}\n </div>\n )}\n </div>\n );\n}\n\nexport const cardWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"CardWidget\",\n displayName: \"Card\",\n fields: [\n // Header\n {\n key: \"headerEnabled\",\n label: \"Show Header\",\n type: \"boolean\",\n description: \"Toggle header visibility\",\n defaultValue: true,\n group: \"Header\",\n },\n {\n key: \"title\",\n label: \"Title\",\n type: \"text\",\n description: \"Card title text\",\n defaultValue: \"Card Title\",\n group: \"Header\",\n requiresKeyToBeTrue: \"headerEnabled\",\n },\n getFontSizeField({\n key: \"titleFontSize\",\n label: \"Title Font Size\",\n description: \"Font size for the title\",\n defaultValue: \"lg\",\n group: \"Header\",\n requiresKeyToBeTrue: \"headerEnabled\",\n }),\n getColorField({\n key: \"titleColor\",\n label: \"Title Color\",\n description: \"Color for the title\",\n defaultValue: \"foreground\",\n group: \"Header\",\n requiresKeyToBeTrue: \"headerEnabled\",\n }),\n getColorField({\n key: \"headerBackground\",\n label: \"Header Background\",\n description: \"Background color for the header\",\n defaultValue: \"transparent\",\n group: \"Header\",\n requiresKeyToBeTrue: \"headerEnabled\",\n }),\n\n // Footer\n {\n key: \"footerEnabled\",\n label: \"Show Footer\",\n type: \"boolean\",\n description: \"Toggle footer visibility\",\n defaultValue: false,\n group: \"Footer\",\n },\n {\n key: \"footerContent\",\n label: \"Footer Text\",\n type: \"text\",\n description: \"Footer content text\",\n defaultValue: \"\",\n group: \"Footer\",\n requiresKeyToBeTrue: \"footerEnabled\",\n },\n getColorField({\n key: \"footerColor\",\n label: \"Footer Color\",\n description: \"Color for the footer text\",\n defaultValue: \"muted\",\n group: \"Footer\",\n requiresKeyToBeTrue: \"footerEnabled\",\n }),\n getColorField({\n key: \"footerBackground\",\n label: \"Footer Background\",\n description: \"Background color for the footer\",\n defaultValue: \"transparent\",\n group: \"Footer\",\n requiresKeyToBeTrue: \"footerEnabled\",\n }),\n\n // Design\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the card\",\n defaultValue: \"background\",\n group: \"Design\",\n },\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Card padding\",\n defaultValue: 6,\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Card border radius\",\n defaultValue: \"xl\",\n group: \"Design\",\n }),\n getBorderWidthField({\n key: \"borderWidth\",\n label: \"Border Width\",\n description: \"Card border width\",\n defaultValue: \"thin\",\n group: \"Design\",\n }),\n getBorderColorField({\n key: \"borderColor\",\n label: \"Border Color\",\n description: \"Card border color\",\n defaultValue: \"muted\",\n group: \"Design\",\n }),\n getGapField({\n key: \"gapSize\",\n label: \"Gap\",\n description: \"Gap between child widgets\",\n defaultValue: \"md\",\n group: \"Design\",\n }),\n ],\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CardWidget-BWwI1G0Z.cjs","names":["useRegistry","ScreenRenderer","useScreenRenderer","DefaultScreenRenderer","gapValues","borderWidthClasses","borderColorClasses","getFontSizeField","getColorField","getPaddingField","getBorderRadiusField","getBorderWidthField","getBorderColorField","getGapField"],"sources":["../../widgets/src/widgets/CardWidget.tsx"],"sourcesContent":["import { ScreenRenderer as DefaultScreenRenderer } from \"../core/ScreenRenderer\";\nimport { useRegistry } from \"../contexts/RegistryContext\";\nimport { useScreenRenderer } from \"../contexts/ScreenRendererContext\";\nimport type {\n WidgetSchema,\n BackgroundValue,\n BorderRadiusOptions,\n BorderWidthOptions,\n PaddingOptions,\n GapOptions,\n ColorOptions,\n FontSizeOptions,\n} from \"@fluid-app/portal-core/types\";\nimport type React from \"react\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport {\n getBorderRadiusField,\n getBorderWidthField,\n getBorderColorField,\n getColorField,\n getFontSizeField,\n getGapField,\n getPaddingField,\n gapValues,\n borderWidthClasses,\n borderColorClasses,\n} from \"../core/fields\";\n\nconst DEFAULT_BACKGROUND: BackgroundValue = {\n type: \"solid\",\n color: \"background\",\n};\nconst DEFAULT_CHILDREN: (WidgetSchema | null)[] = [];\n\ntype CardWidgetProps = {\n // Header\n headerEnabled?: boolean;\n title?: string;\n titleFontSize?: FontSizeOptions;\n titleColor?: ColorOptions;\n headerBackground?: ColorOptions;\n\n // Footer\n footerEnabled?: boolean;\n footerContent?: string;\n footerColor?: ColorOptions;\n footerBackground?: ColorOptions;\n\n // Styling\n background?: BackgroundValue;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n borderWidth?: BorderWidthOptions;\n borderColor?: ColorOptions;\n /** @deprecated Use borderWidth instead */\n borderEnabled?: boolean;\n gapSize?: GapOptions;\n\n // Container props (children = other widgets)\n children?: (WidgetSchema | null)[];\n\n // Styling\n className?: string;\n};\n\nexport function CardWidget({\n // Header\n headerEnabled = true,\n title = \"Card Title\",\n titleFontSize = \"lg\",\n titleColor = \"foreground\",\n headerBackground = \"transparent\",\n\n // Footer\n footerEnabled = false,\n footerContent = \"\",\n footerColor = \"muted\",\n footerBackground = \"transparent\",\n\n // Styling\n background = DEFAULT_BACKGROUND,\n padding = 6,\n borderRadius = \"xl\",\n borderWidth = \"thin\",\n borderColor = \"muted\",\n borderEnabled,\n gapSize = \"md\",\n\n // Container\n children = DEFAULT_CHILDREN,\n\n className = \"\",\n}: CardWidgetProps): React.JSX.Element {\n // Get registry from context if not provided as prop\n const contextRegistry = useRegistry();\n\n // Use ScreenRenderer from context, fall back to local\n const ContextScreenRenderer = useScreenRenderer();\n const ScreenRenderer = ContextScreenRenderer ?? DefaultScreenRenderer;\n\n // Extract background values\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n\n const gapSizeValue = gapSize ? gapValues[gapSize] : 4;\n\n // Backwards compatibility: if legacy borderEnabled prop exists, map it\n const effectiveBorderWidth = borderEnabled === false ? \"none\" : borderWidth;\n\n const cardClasses = [\n \"flex flex-col gap-6\",\n `bg-${backgroundColor}`,\n `p-${padding}`,\n `rounded-${borderRadius}`,\n borderWidthClasses[effectiveBorderWidth],\n effectiveBorderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const containerStyle: React.CSSProperties = {\n backgroundImage,\n };\n\n // Filter out null children\n const validChildren = children.filter(\n (child): child is WidgetSchema => child !== null,\n );\n\n return (\n <div data-slot=\"card\" className={cardClasses} style={containerStyle}>\n {headerEnabled && (title || headerBackground !== \"transparent\") && (\n <div\n data-slot=\"card-header\"\n className={\n headerBackground !== \"transparent\"\n ? `bg-${headerBackground} -mx-${padding} -mt-${padding} px-${padding} py-${padding} rounded-t-${borderRadius}`\n : undefined\n }\n >\n {title && (\n <div\n data-slot=\"card-title\"\n className={`text-${titleFontSize} text-${titleColor} font-header leading-none font-semibold`}\n >\n {title}\n </div>\n )}\n </div>\n )}\n\n <div data-slot=\"card-content\" className=\"@container flex-1\">\n {contextRegistry ? (\n <ScreenRenderer\n screen={validChildren}\n registry={contextRegistry}\n className={`flex flex-col gap-${gapSizeValue}`}\n />\n ) : (\n <div className={`flex flex-col gap-${gapSizeValue}`} />\n )}\n </div>\n\n {footerEnabled && footerContent && (\n <div\n data-slot=\"card-footer\"\n className={[\n `text-sm text-${footerColor} flex items-center`,\n footerBackground !== \"transparent\"\n ? `bg-${footerBackground} -mx-${padding} -mb-${padding} px-${padding} py-${padding} rounded-b-${borderRadius}`\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {footerContent}\n </div>\n )}\n </div>\n );\n}\n\nexport const cardWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"CardWidget\",\n displayName: \"Card\",\n fields: [\n // Header\n {\n key: \"headerEnabled\",\n label: \"Show Header\",\n type: \"boolean\",\n description: \"Toggle header visibility\",\n defaultValue: true,\n group: \"Header\",\n },\n {\n key: \"title\",\n label: \"Title\",\n type: \"text\",\n description: \"Card title text\",\n defaultValue: \"Card Title\",\n group: \"Header\",\n requiresKeyToBeTrue: \"headerEnabled\",\n },\n getFontSizeField({\n key: \"titleFontSize\",\n label: \"Title Font Size\",\n description: \"Font size for the title\",\n defaultValue: \"lg\",\n group: \"Header\",\n requiresKeyToBeTrue: \"headerEnabled\",\n }),\n getColorField({\n key: \"titleColor\",\n label: \"Title Color\",\n description: \"Color for the title\",\n defaultValue: \"foreground\",\n group: \"Header\",\n requiresKeyToBeTrue: \"headerEnabled\",\n }),\n getColorField({\n key: \"headerBackground\",\n label: \"Header Background\",\n description: \"Background color for the header\",\n defaultValue: \"transparent\",\n group: \"Header\",\n requiresKeyToBeTrue: \"headerEnabled\",\n }),\n\n // Footer\n {\n key: \"footerEnabled\",\n label: \"Show Footer\",\n type: \"boolean\",\n description: \"Toggle footer visibility\",\n defaultValue: false,\n group: \"Footer\",\n },\n {\n key: \"footerContent\",\n label: \"Footer Text\",\n type: \"text\",\n description: \"Footer content text\",\n defaultValue: \"\",\n group: \"Footer\",\n requiresKeyToBeTrue: \"footerEnabled\",\n },\n getColorField({\n key: \"footerColor\",\n label: \"Footer Color\",\n description: \"Color for the footer text\",\n defaultValue: \"muted\",\n group: \"Footer\",\n requiresKeyToBeTrue: \"footerEnabled\",\n }),\n getColorField({\n key: \"footerBackground\",\n label: \"Footer Background\",\n description: \"Background color for the footer\",\n defaultValue: \"transparent\",\n group: \"Footer\",\n requiresKeyToBeTrue: \"footerEnabled\",\n }),\n\n // Design\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the card\",\n defaultValue: \"background\",\n group: \"Design\",\n },\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Card padding\",\n defaultValue: 6,\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Card border radius\",\n defaultValue: \"xl\",\n group: \"Design\",\n }),\n getBorderWidthField({\n key: \"borderWidth\",\n label: \"Border Width\",\n description: \"Card border width\",\n defaultValue: \"thin\",\n group: \"Design\",\n }),\n getBorderColorField({\n key: \"borderColor\",\n label: \"Border Color\",\n description: \"Card border color\",\n defaultValue: \"muted\",\n group: \"Design\",\n }),\n getGapField({\n key: \"gapSize\",\n label: \"Gap\",\n description: \"Gap between child widgets\",\n defaultValue: \"md\",\n group: \"Design\",\n }),\n ],\n};\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
require("./chunk-9hOWP6kD.cjs");
|
|
2
|
-
require("./ScreenRenderer-
|
|
2
|
+
require("./ScreenRenderer-Ce8MJPnR.cjs");
|
|
3
3
|
require("./registry-context-Ds0_y48D.cjs");
|
|
4
4
|
require("./translation-api-context-factory-B6BS_JmA.cjs");
|
|
5
5
|
require("./shell-translation-api-context-uGur0Kah.cjs");
|
|
6
6
|
require("./registries-DiCQ4oFx.cjs");
|
|
7
7
|
require("./fields-D__8kJeJ.cjs");
|
|
8
|
-
const require_CardWidget = require("./CardWidget-
|
|
8
|
+
const require_CardWidget = require("./CardWidget-BWwI1G0Z.cjs");
|
|
9
9
|
exports.cardWidgetPropertySchema = require_CardWidget.cardWidgetPropertySchema;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ut as __exportAll } from "./use-account-D70N5avv.mjs";
|
|
2
|
-
import { c as useScreenRenderer, t as ScreenRenderer, u as useRegistry } from "./ScreenRenderer-
|
|
2
|
+
import { c as useScreenRenderer, t as ScreenRenderer, u as useRegistry } from "./ScreenRenderer-CcT_j-WQ.mjs";
|
|
3
3
|
import { f as getGapField, i as getBorderColorField, l as getColorField, m as getPaddingField, n as borderWidthClasses, o as getBorderRadiusField, r as gapValues, s as getBorderWidthField, t as borderColorClasses, u as getFontSizeField } from "./registries-CSAha0WD.mjs";
|
|
4
4
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
5
|
//#region ../widgets/src/widgets/CardWidget.tsx
|
|
@@ -187,4 +187,4 @@ const cardWidgetPropertySchema = {
|
|
|
187
187
|
//#endregion
|
|
188
188
|
export { CardWidget_exports as n, cardWidgetPropertySchema as r, CardWidget as t };
|
|
189
189
|
|
|
190
|
-
//# sourceMappingURL=CardWidget-
|
|
190
|
+
//# sourceMappingURL=CardWidget-cIc9cOG9.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CardWidget-DdV1HDy0.mjs","names":["ScreenRenderer","DefaultScreenRenderer"],"sources":["../../widgets/src/widgets/CardWidget.tsx"],"sourcesContent":["import { ScreenRenderer as DefaultScreenRenderer } from \"../core/ScreenRenderer\";\nimport { useRegistry } from \"../contexts/RegistryContext\";\nimport { useScreenRenderer } from \"../contexts/ScreenRendererContext\";\nimport type {\n WidgetSchema,\n BackgroundValue,\n BorderRadiusOptions,\n BorderWidthOptions,\n PaddingOptions,\n GapOptions,\n ColorOptions,\n FontSizeOptions,\n} from \"@fluid-app/portal-core/types\";\nimport type React from \"react\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport {\n getBorderRadiusField,\n getBorderWidthField,\n getBorderColorField,\n getColorField,\n getFontSizeField,\n getGapField,\n getPaddingField,\n gapValues,\n borderWidthClasses,\n borderColorClasses,\n} from \"../core/fields\";\n\nconst DEFAULT_BACKGROUND: BackgroundValue = {\n type: \"solid\",\n color: \"background\",\n};\nconst DEFAULT_CHILDREN: (WidgetSchema | null)[] = [];\n\ntype CardWidgetProps = {\n // Header\n headerEnabled?: boolean;\n title?: string;\n titleFontSize?: FontSizeOptions;\n titleColor?: ColorOptions;\n headerBackground?: ColorOptions;\n\n // Footer\n footerEnabled?: boolean;\n footerContent?: string;\n footerColor?: ColorOptions;\n footerBackground?: ColorOptions;\n\n // Styling\n background?: BackgroundValue;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n borderWidth?: BorderWidthOptions;\n borderColor?: ColorOptions;\n /** @deprecated Use borderWidth instead */\n borderEnabled?: boolean;\n gapSize?: GapOptions;\n\n // Container props (children = other widgets)\n children?: (WidgetSchema | null)[];\n\n // Styling\n className?: string;\n};\n\nexport function CardWidget({\n // Header\n headerEnabled = true,\n title = \"Card Title\",\n titleFontSize = \"lg\",\n titleColor = \"foreground\",\n headerBackground = \"transparent\",\n\n // Footer\n footerEnabled = false,\n footerContent = \"\",\n footerColor = \"muted\",\n footerBackground = \"transparent\",\n\n // Styling\n background = DEFAULT_BACKGROUND,\n padding = 6,\n borderRadius = \"xl\",\n borderWidth = \"thin\",\n borderColor = \"muted\",\n borderEnabled,\n gapSize = \"md\",\n\n // Container\n children = DEFAULT_CHILDREN,\n\n className = \"\",\n}: CardWidgetProps): React.JSX.Element {\n // Get registry from context if not provided as prop\n const contextRegistry = useRegistry();\n\n // Use ScreenRenderer from context, fall back to local\n const ContextScreenRenderer = useScreenRenderer();\n const ScreenRenderer = ContextScreenRenderer ?? DefaultScreenRenderer;\n\n // Extract background values\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n\n const gapSizeValue = gapSize ? gapValues[gapSize] : 4;\n\n // Backwards compatibility: if legacy borderEnabled prop exists, map it\n const effectiveBorderWidth = borderEnabled === false ? \"none\" : borderWidth;\n\n const cardClasses = [\n \"flex flex-col gap-6\",\n `bg-${backgroundColor}`,\n `p-${padding}`,\n `rounded-${borderRadius}`,\n borderWidthClasses[effectiveBorderWidth],\n effectiveBorderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const containerStyle: React.CSSProperties = {\n backgroundImage,\n };\n\n // Filter out null children\n const validChildren = children.filter(\n (child): child is WidgetSchema => child !== null,\n );\n\n return (\n <div data-slot=\"card\" className={cardClasses} style={containerStyle}>\n {headerEnabled && (title || headerBackground !== \"transparent\") && (\n <div\n data-slot=\"card-header\"\n className={\n headerBackground !== \"transparent\"\n ? `bg-${headerBackground} -mx-${padding} -mt-${padding} px-${padding} py-${padding} rounded-t-${borderRadius}`\n : undefined\n }\n >\n {title && (\n <div\n data-slot=\"card-title\"\n className={`text-${titleFontSize} text-${titleColor} font-header leading-none font-semibold`}\n >\n {title}\n </div>\n )}\n </div>\n )}\n\n <div data-slot=\"card-content\" className=\"@container flex-1\">\n {contextRegistry ? (\n <ScreenRenderer\n screen={validChildren}\n registry={contextRegistry}\n className={`flex flex-col gap-${gapSizeValue}`}\n />\n ) : (\n <div className={`flex flex-col gap-${gapSizeValue}`} />\n )}\n </div>\n\n {footerEnabled && footerContent && (\n <div\n data-slot=\"card-footer\"\n className={[\n `text-sm text-${footerColor} flex items-center`,\n footerBackground !== \"transparent\"\n ? `bg-${footerBackground} -mx-${padding} -mb-${padding} px-${padding} py-${padding} rounded-b-${borderRadius}`\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {footerContent}\n </div>\n )}\n </div>\n );\n}\n\nexport const cardWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"CardWidget\",\n displayName: \"Card\",\n fields: [\n // Header\n {\n key: \"headerEnabled\",\n label: \"Show Header\",\n type: \"boolean\",\n description: \"Toggle header visibility\",\n defaultValue: true,\n group: \"Header\",\n },\n {\n key: \"title\",\n label: \"Title\",\n type: \"text\",\n description: \"Card title text\",\n defaultValue: \"Card Title\",\n group: \"Header\",\n requiresKeyToBeTrue: \"headerEnabled\",\n },\n getFontSizeField({\n key: \"titleFontSize\",\n label: \"Title Font Size\",\n description: \"Font size for the title\",\n defaultValue: \"lg\",\n group: \"Header\",\n requiresKeyToBeTrue: \"headerEnabled\",\n }),\n getColorField({\n key: \"titleColor\",\n label: \"Title Color\",\n description: \"Color for the title\",\n defaultValue: \"foreground\",\n group: \"Header\",\n requiresKeyToBeTrue: \"headerEnabled\",\n }),\n getColorField({\n key: \"headerBackground\",\n label: \"Header Background\",\n description: \"Background color for the header\",\n defaultValue: \"transparent\",\n group: \"Header\",\n requiresKeyToBeTrue: \"headerEnabled\",\n }),\n\n // Footer\n {\n key: \"footerEnabled\",\n label: \"Show Footer\",\n type: \"boolean\",\n description: \"Toggle footer visibility\",\n defaultValue: false,\n group: \"Footer\",\n },\n {\n key: \"footerContent\",\n label: \"Footer Text\",\n type: \"text\",\n description: \"Footer content text\",\n defaultValue: \"\",\n group: \"Footer\",\n requiresKeyToBeTrue: \"footerEnabled\",\n },\n getColorField({\n key: \"footerColor\",\n label: \"Footer Color\",\n description: \"Color for the footer text\",\n defaultValue: \"muted\",\n group: \"Footer\",\n requiresKeyToBeTrue: \"footerEnabled\",\n }),\n getColorField({\n key: \"footerBackground\",\n label: \"Footer Background\",\n description: \"Background color for the footer\",\n defaultValue: \"transparent\",\n group: \"Footer\",\n requiresKeyToBeTrue: \"footerEnabled\",\n }),\n\n // Design\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the card\",\n defaultValue: \"background\",\n group: \"Design\",\n },\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Card padding\",\n defaultValue: 6,\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Card border radius\",\n defaultValue: \"xl\",\n group: \"Design\",\n }),\n getBorderWidthField({\n key: \"borderWidth\",\n label: \"Border Width\",\n description: \"Card border width\",\n defaultValue: \"thin\",\n group: \"Design\",\n }),\n getBorderColorField({\n key: \"borderColor\",\n label: \"Border Color\",\n description: \"Card border color\",\n defaultValue: \"muted\",\n group: \"Design\",\n }),\n getGapField({\n key: \"gapSize\",\n label: \"Gap\",\n description: \"Gap between child widgets\",\n defaultValue: \"md\",\n group: \"Design\",\n }),\n ],\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CardWidget-cIc9cOG9.mjs","names":["ScreenRenderer","DefaultScreenRenderer"],"sources":["../../widgets/src/widgets/CardWidget.tsx"],"sourcesContent":["import { ScreenRenderer as DefaultScreenRenderer } from \"../core/ScreenRenderer\";\nimport { useRegistry } from \"../contexts/RegistryContext\";\nimport { useScreenRenderer } from \"../contexts/ScreenRendererContext\";\nimport type {\n WidgetSchema,\n BackgroundValue,\n BorderRadiusOptions,\n BorderWidthOptions,\n PaddingOptions,\n GapOptions,\n ColorOptions,\n FontSizeOptions,\n} from \"@fluid-app/portal-core/types\";\nimport type React from \"react\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport {\n getBorderRadiusField,\n getBorderWidthField,\n getBorderColorField,\n getColorField,\n getFontSizeField,\n getGapField,\n getPaddingField,\n gapValues,\n borderWidthClasses,\n borderColorClasses,\n} from \"../core/fields\";\n\nconst DEFAULT_BACKGROUND: BackgroundValue = {\n type: \"solid\",\n color: \"background\",\n};\nconst DEFAULT_CHILDREN: (WidgetSchema | null)[] = [];\n\ntype CardWidgetProps = {\n // Header\n headerEnabled?: boolean;\n title?: string;\n titleFontSize?: FontSizeOptions;\n titleColor?: ColorOptions;\n headerBackground?: ColorOptions;\n\n // Footer\n footerEnabled?: boolean;\n footerContent?: string;\n footerColor?: ColorOptions;\n footerBackground?: ColorOptions;\n\n // Styling\n background?: BackgroundValue;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n borderWidth?: BorderWidthOptions;\n borderColor?: ColorOptions;\n /** @deprecated Use borderWidth instead */\n borderEnabled?: boolean;\n gapSize?: GapOptions;\n\n // Container props (children = other widgets)\n children?: (WidgetSchema | null)[];\n\n // Styling\n className?: string;\n};\n\nexport function CardWidget({\n // Header\n headerEnabled = true,\n title = \"Card Title\",\n titleFontSize = \"lg\",\n titleColor = \"foreground\",\n headerBackground = \"transparent\",\n\n // Footer\n footerEnabled = false,\n footerContent = \"\",\n footerColor = \"muted\",\n footerBackground = \"transparent\",\n\n // Styling\n background = DEFAULT_BACKGROUND,\n padding = 6,\n borderRadius = \"xl\",\n borderWidth = \"thin\",\n borderColor = \"muted\",\n borderEnabled,\n gapSize = \"md\",\n\n // Container\n children = DEFAULT_CHILDREN,\n\n className = \"\",\n}: CardWidgetProps): React.JSX.Element {\n // Get registry from context if not provided as prop\n const contextRegistry = useRegistry();\n\n // Use ScreenRenderer from context, fall back to local\n const ContextScreenRenderer = useScreenRenderer();\n const ScreenRenderer = ContextScreenRenderer ?? DefaultScreenRenderer;\n\n // Extract background values\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n\n const gapSizeValue = gapSize ? gapValues[gapSize] : 4;\n\n // Backwards compatibility: if legacy borderEnabled prop exists, map it\n const effectiveBorderWidth = borderEnabled === false ? \"none\" : borderWidth;\n\n const cardClasses = [\n \"flex flex-col gap-6\",\n `bg-${backgroundColor}`,\n `p-${padding}`,\n `rounded-${borderRadius}`,\n borderWidthClasses[effectiveBorderWidth],\n effectiveBorderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const containerStyle: React.CSSProperties = {\n backgroundImage,\n };\n\n // Filter out null children\n const validChildren = children.filter(\n (child): child is WidgetSchema => child !== null,\n );\n\n return (\n <div data-slot=\"card\" className={cardClasses} style={containerStyle}>\n {headerEnabled && (title || headerBackground !== \"transparent\") && (\n <div\n data-slot=\"card-header\"\n className={\n headerBackground !== \"transparent\"\n ? `bg-${headerBackground} -mx-${padding} -mt-${padding} px-${padding} py-${padding} rounded-t-${borderRadius}`\n : undefined\n }\n >\n {title && (\n <div\n data-slot=\"card-title\"\n className={`text-${titleFontSize} text-${titleColor} font-header leading-none font-semibold`}\n >\n {title}\n </div>\n )}\n </div>\n )}\n\n <div data-slot=\"card-content\" className=\"@container flex-1\">\n {contextRegistry ? (\n <ScreenRenderer\n screen={validChildren}\n registry={contextRegistry}\n className={`flex flex-col gap-${gapSizeValue}`}\n />\n ) : (\n <div className={`flex flex-col gap-${gapSizeValue}`} />\n )}\n </div>\n\n {footerEnabled && footerContent && (\n <div\n data-slot=\"card-footer\"\n className={[\n `text-sm text-${footerColor} flex items-center`,\n footerBackground !== \"transparent\"\n ? `bg-${footerBackground} -mx-${padding} -mb-${padding} px-${padding} py-${padding} rounded-b-${borderRadius}`\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {footerContent}\n </div>\n )}\n </div>\n );\n}\n\nexport const cardWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"CardWidget\",\n displayName: \"Card\",\n fields: [\n // Header\n {\n key: \"headerEnabled\",\n label: \"Show Header\",\n type: \"boolean\",\n description: \"Toggle header visibility\",\n defaultValue: true,\n group: \"Header\",\n },\n {\n key: \"title\",\n label: \"Title\",\n type: \"text\",\n description: \"Card title text\",\n defaultValue: \"Card Title\",\n group: \"Header\",\n requiresKeyToBeTrue: \"headerEnabled\",\n },\n getFontSizeField({\n key: \"titleFontSize\",\n label: \"Title Font Size\",\n description: \"Font size for the title\",\n defaultValue: \"lg\",\n group: \"Header\",\n requiresKeyToBeTrue: \"headerEnabled\",\n }),\n getColorField({\n key: \"titleColor\",\n label: \"Title Color\",\n description: \"Color for the title\",\n defaultValue: \"foreground\",\n group: \"Header\",\n requiresKeyToBeTrue: \"headerEnabled\",\n }),\n getColorField({\n key: \"headerBackground\",\n label: \"Header Background\",\n description: \"Background color for the header\",\n defaultValue: \"transparent\",\n group: \"Header\",\n requiresKeyToBeTrue: \"headerEnabled\",\n }),\n\n // Footer\n {\n key: \"footerEnabled\",\n label: \"Show Footer\",\n type: \"boolean\",\n description: \"Toggle footer visibility\",\n defaultValue: false,\n group: \"Footer\",\n },\n {\n key: \"footerContent\",\n label: \"Footer Text\",\n type: \"text\",\n description: \"Footer content text\",\n defaultValue: \"\",\n group: \"Footer\",\n requiresKeyToBeTrue: \"footerEnabled\",\n },\n getColorField({\n key: \"footerColor\",\n label: \"Footer Color\",\n description: \"Color for the footer text\",\n defaultValue: \"muted\",\n group: \"Footer\",\n requiresKeyToBeTrue: \"footerEnabled\",\n }),\n getColorField({\n key: \"footerBackground\",\n label: \"Footer Background\",\n description: \"Background color for the footer\",\n defaultValue: \"transparent\",\n group: \"Footer\",\n requiresKeyToBeTrue: \"footerEnabled\",\n }),\n\n // Design\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the card\",\n defaultValue: \"background\",\n group: \"Design\",\n },\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Card padding\",\n defaultValue: 6,\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Card border radius\",\n defaultValue: \"xl\",\n group: \"Design\",\n }),\n getBorderWidthField({\n key: \"borderWidth\",\n label: \"Border Width\",\n description: \"Card border width\",\n defaultValue: \"thin\",\n group: \"Design\",\n }),\n getBorderColorField({\n key: \"borderColor\",\n label: \"Border Color\",\n description: \"Card border color\",\n defaultValue: \"muted\",\n group: \"Design\",\n }),\n getGapField({\n key: \"gapSize\",\n label: \"Gap\",\n description: \"Gap between child widgets\",\n defaultValue: \"md\",\n group: \"Design\",\n }),\n ],\n};\n"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
require("./chunk-9hOWP6kD.cjs");
|
|
2
|
-
require("./ScreenRenderer-
|
|
2
|
+
require("./ScreenRenderer-Ce8MJPnR.cjs");
|
|
3
3
|
require("./registry-context-Ds0_y48D.cjs");
|
|
4
4
|
require("./translation-api-context-factory-B6BS_JmA.cjs");
|
|
5
5
|
require("./shell-translation-api-context-uGur0Kah.cjs");
|
|
6
|
-
require("./LayoutWidget-
|
|
6
|
+
require("./LayoutWidget-BqUbneWw.cjs");
|
|
7
7
|
require("./registries-DiCQ4oFx.cjs");
|
|
8
8
|
require("./fields-D__8kJeJ.cjs");
|
|
9
|
-
const require_ContainerWidget = require("./ContainerWidget-
|
|
9
|
+
const require_ContainerWidget = require("./ContainerWidget-bMMdFhLg.cjs");
|
|
10
10
|
exports.containerWidgetPropertySchema = require_ContainerWidget.containerWidgetPropertySchema;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require("./chunk-9hOWP6kD.cjs");
|
|
2
|
-
const require_LayoutWidget = require("./LayoutWidget-
|
|
2
|
+
const require_LayoutWidget = require("./LayoutWidget-BqUbneWw.cjs");
|
|
3
3
|
const require_registries = require("./registries-DiCQ4oFx.cjs");
|
|
4
4
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
5
5
|
//#region ../widgets/src/widgets/ContainerWidget.tsx
|
|
@@ -48,4 +48,4 @@ Object.defineProperty(exports, "containerWidgetPropertySchema", {
|
|
|
48
48
|
}
|
|
49
49
|
});
|
|
50
50
|
|
|
51
|
-
//# sourceMappingURL=ContainerWidget-
|
|
51
|
+
//# sourceMappingURL=ContainerWidget-bMMdFhLg.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContainerWidget-
|
|
1
|
+
{"version":3,"file":"ContainerWidget-bMMdFhLg.cjs","names":["LayoutWidget","getGapField","getPaddingField"],"sources":["../../widgets/src/widgets/ContainerWidget.tsx"],"sourcesContent":["import type { ComponentProps } from \"react\";\nimport type React from \"react\";\nimport { LayoutWidget } from \"./LayoutWidget\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport { getGapField, getPaddingField } from \"../core/fields\";\n\n/**\n * ContainerWidget - Root container widget for screens\n *\n * This widget wraps LayoutWidget and serves as the foundational container\n * for every screen. It cannot be added, deleted, moved, or copied by users.\n *\n * Only exposes limited settings: gap, padding, and backgroundColor\n */\n\ntype ContainerWidgetProps = ComponentProps<typeof LayoutWidget>;\n\nexport function ContainerWidget(\n props: ContainerWidgetProps,\n): React.JSX.Element {\n // Pass all props through to LayoutWidget\n return <LayoutWidget {...props} />;\n}\n\nexport const containerWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"ContainerWidget\",\n displayName: \"Canvas Settings\",\n fields: [\n getGapField({\n key: \"gapSize\",\n label: \"Gap\",\n description: \"Gap between widgets\",\n defaultValue: \"md\",\n group: \"Design\",\n }),\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Padding for the container\",\n defaultValue: 4,\n group: \"Design\",\n }),\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the container\",\n defaultValue: \"background\",\n group: \"Design\",\n },\n ],\n};\n"],"mappings":";;;;;AAiBA,SAAgB,gBACd,OACmB;AAEnB,QAAO,iBAAA,GAAA,kBAAA,KAACA,qBAAAA,cAAD,EAAc,GAAI,OAAS,CAAA;;AAGpC,MAAa,gCAAsD;CACjE,YAAY;CACZ,aAAa;CACb,QAAQ;EACNC,mBAAAA,YAAY;GACV,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,OAAO;GACR,CAAC;EACFC,mBAAAA,gBAAgB;GACd,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,OAAO;GACR,CAAC;EACF;GACE,MAAM;GACN,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,OAAO;GACR;EACF;CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ut as __exportAll } from "./use-account-D70N5avv.mjs";
|
|
2
|
-
import { t as LayoutWidget } from "./LayoutWidget-
|
|
2
|
+
import { t as LayoutWidget } from "./LayoutWidget-D3qYKt9F.mjs";
|
|
3
3
|
import { f as getGapField, m as getPaddingField } from "./registries-CSAha0WD.mjs";
|
|
4
4
|
import { jsx } from "react/jsx-runtime";
|
|
5
5
|
//#region ../widgets/src/widgets/ContainerWidget.tsx
|
|
@@ -41,4 +41,4 @@ const containerWidgetPropertySchema = {
|
|
|
41
41
|
//#endregion
|
|
42
42
|
export { ContainerWidget_exports as n, containerWidgetPropertySchema as r, ContainerWidget as t };
|
|
43
43
|
|
|
44
|
-
//# sourceMappingURL=ContainerWidget-
|
|
44
|
+
//# sourceMappingURL=ContainerWidget-mSWihekF.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContainerWidget-
|
|
1
|
+
{"version":3,"file":"ContainerWidget-mSWihekF.mjs","names":[],"sources":["../../widgets/src/widgets/ContainerWidget.tsx"],"sourcesContent":["import type { ComponentProps } from \"react\";\nimport type React from \"react\";\nimport { LayoutWidget } from \"./LayoutWidget\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport { getGapField, getPaddingField } from \"../core/fields\";\n\n/**\n * ContainerWidget - Root container widget for screens\n *\n * This widget wraps LayoutWidget and serves as the foundational container\n * for every screen. It cannot be added, deleted, moved, or copied by users.\n *\n * Only exposes limited settings: gap, padding, and backgroundColor\n */\n\ntype ContainerWidgetProps = ComponentProps<typeof LayoutWidget>;\n\nexport function ContainerWidget(\n props: ContainerWidgetProps,\n): React.JSX.Element {\n // Pass all props through to LayoutWidget\n return <LayoutWidget {...props} />;\n}\n\nexport const containerWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"ContainerWidget\",\n displayName: \"Canvas Settings\",\n fields: [\n getGapField({\n key: \"gapSize\",\n label: \"Gap\",\n description: \"Gap between widgets\",\n defaultValue: \"md\",\n group: \"Design\",\n }),\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Padding for the container\",\n defaultValue: 4,\n group: \"Design\",\n }),\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the container\",\n defaultValue: \"background\",\n group: \"Design\",\n },\n ],\n};\n"],"mappings":";;;;;;;;;AAiBA,SAAgB,gBACd,OACmB;AAEnB,QAAO,oBAAC,cAAD,EAAc,GAAI,OAAS,CAAA;;AAGpC,MAAa,gCAAsD;CACjE,YAAY;CACZ,aAAa;CACb,QAAQ;EACN,YAAY;GACV,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,OAAO;GACR,CAAC;EACF,gBAAgB;GACd,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,OAAO;GACR,CAAC;EACF;GACE,MAAM;GACN,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,OAAO;GACR;EACF;CACF"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
require("./chunk-9hOWP6kD.cjs");
|
|
2
|
+
require("./use-optional-store-CIM4spDu.cjs");
|
|
2
3
|
require("./RepUserContext-BiKQBY47.cjs");
|
|
3
4
|
require("./WidgetRenderStateContext-CUkarAnq.cjs");
|
|
4
5
|
require("./translation-api-context-factory-B6BS_JmA.cjs");
|
|
5
6
|
require("./shell-translation-api-context-uGur0Kah.cjs");
|
|
6
7
|
require("./registries-DiCQ4oFx.cjs");
|
|
7
8
|
require("./fields-D__8kJeJ.cjs");
|
|
8
|
-
const require_EmbedWidget = require("./EmbedWidget-
|
|
9
|
+
const require_EmbedWidget = require("./EmbedWidget-D1lbYjuL.cjs");
|
|
9
10
|
exports.embedWidgetPropertySchema = require_EmbedWidget.embedWidgetPropertySchema;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require("./chunk-9hOWP6kD.cjs");
|
|
2
|
+
const require_use_optional_store = require("./use-optional-store-CIM4spDu.cjs");
|
|
2
3
|
const require_RepUserContext = require("./RepUserContext-BiKQBY47.cjs");
|
|
3
4
|
const require_WidgetRenderStateContext = require("./WidgetRenderStateContext-CUkarAnq.cjs");
|
|
4
5
|
const require_shell_translation_api_context = require("./shell-translation-api-context-uGur0Kah.cjs");
|
|
@@ -7,6 +8,219 @@ let react = require("react");
|
|
|
7
8
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
8
9
|
let lucide_react = require("lucide-react");
|
|
9
10
|
let react_dom = require("react-dom");
|
|
11
|
+
//#region ../../platform/app-bridge/src/errors.ts
|
|
12
|
+
var FluidBridgeError = class extends Error {
|
|
13
|
+
code;
|
|
14
|
+
details;
|
|
15
|
+
constructor(code, message, details) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = "FluidBridgeError";
|
|
18
|
+
this.code = code;
|
|
19
|
+
this.details = details;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
var FluidBridgeIncompatibleVersionError = class extends FluidBridgeError {
|
|
23
|
+
constructor(message = "Fluid App Bridge SDK is not compatible with the host", details) {
|
|
24
|
+
super("incompatible_version", message, details);
|
|
25
|
+
this.name = "FluidBridgeIncompatibleVersionError";
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
var FluidBridgeTokenMintError = class extends FluidBridgeError {
|
|
29
|
+
constructor(message = "Fluid App Bridge host could not mint a session token", details) {
|
|
30
|
+
super("token_mint_failed", message, details);
|
|
31
|
+
this.name = "FluidBridgeTokenMintError";
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
var FluidBridgeUnauthorizedError = class extends FluidBridgeError {
|
|
35
|
+
constructor(message = "Fluid App Bridge request is unauthorized", details) {
|
|
36
|
+
super("unauthorized", message, details);
|
|
37
|
+
this.name = "FluidBridgeUnauthorizedError";
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
var FluidBridgeForbiddenOriginError = class extends FluidBridgeError {
|
|
41
|
+
constructor(message = "Fluid App Bridge host origin is forbidden", details) {
|
|
42
|
+
super("forbidden_origin", message, details);
|
|
43
|
+
this.name = "FluidBridgeForbiddenOriginError";
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
var FluidBridgeInvalidContextError = class extends FluidBridgeError {
|
|
47
|
+
constructor(message = "Fluid App Bridge context is invalid", details) {
|
|
48
|
+
super("invalid_context", message, details);
|
|
49
|
+
this.name = "FluidBridgeInvalidContextError";
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
var FluidBridgeFailedAuthenticationError = class extends FluidBridgeError {
|
|
53
|
+
constructor(message = "Fluid App Bridge authentication failed", details) {
|
|
54
|
+
super("failed_authentication", message, details);
|
|
55
|
+
this.name = "FluidBridgeFailedAuthenticationError";
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
//#endregion
|
|
59
|
+
//#region ../../platform/app-bridge/src/protocol.ts
|
|
60
|
+
const FLUID_BRIDGE_PROTOCOL_VERSION = "2026-07";
|
|
61
|
+
const APP_BRIDGE_SDK_NAME = "@fluid-commerce/app-bridge";
|
|
62
|
+
const APP_BRIDGE_SDK_VERSION = "0.1.0";
|
|
63
|
+
const FluidBridgeMessageType = {
|
|
64
|
+
SessionTokenRequest: "FLUID::SESSION_TOKEN_REQUEST",
|
|
65
|
+
SessionTokenRespond: "FLUID::SESSION_TOKEN_RESPOND",
|
|
66
|
+
ContextRequest: "FLUID::CONTEXT_REQUEST",
|
|
67
|
+
ContextRespond: "FLUID::CONTEXT_RESPOND",
|
|
68
|
+
FailedAuthentication: "FLUID::ERROR::FAILED_AUTHENTICATION",
|
|
69
|
+
Unauthorized: "FLUID::ERROR::UNAUTHORIZED",
|
|
70
|
+
IncompatibleVersion: "FLUID::ERROR::INCOMPATIBLE_VERSION",
|
|
71
|
+
TokenMintFailed: "FLUID::ERROR::TOKEN_MINT_FAILED",
|
|
72
|
+
InvalidContext: "FLUID::ERROR::INVALID_CONTEXT"
|
|
73
|
+
};
|
|
74
|
+
//#endregion
|
|
75
|
+
//#region ../../platform/app-bridge/src/host.ts
|
|
76
|
+
function createFluidBridgeHost(options) {
|
|
77
|
+
const targetWindow = options.targetWindow ?? window;
|
|
78
|
+
const appOrigin = normalizeOrigin(options.appOrigin);
|
|
79
|
+
const handleMessage = (event) => {
|
|
80
|
+
if (event.origin !== appOrigin) return;
|
|
81
|
+
if (event.source !== options.iframe.contentWindow) return;
|
|
82
|
+
if (!isBridgeEnvelope(event.data)) return;
|
|
83
|
+
respondToBridgeMessage(options, event.data, appOrigin);
|
|
84
|
+
};
|
|
85
|
+
targetWindow.addEventListener("message", handleMessage);
|
|
86
|
+
return { destroy: () => targetWindow.removeEventListener("message", handleMessage) };
|
|
87
|
+
}
|
|
88
|
+
async function respondToBridgeMessage(options, envelope, appOrigin) {
|
|
89
|
+
const childWindow = options.iframe.contentWindow;
|
|
90
|
+
if (!childWindow) return;
|
|
91
|
+
try {
|
|
92
|
+
validateRequestPayload(envelope.payload, options.clientId);
|
|
93
|
+
switch (envelope.type) {
|
|
94
|
+
case FluidBridgeMessageType.ContextRequest: {
|
|
95
|
+
const context = await options.getContext();
|
|
96
|
+
childWindow.postMessage({
|
|
97
|
+
id: envelope.id,
|
|
98
|
+
type: FluidBridgeMessageType.ContextRespond,
|
|
99
|
+
payload: context
|
|
100
|
+
}, appOrigin);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
case FluidBridgeMessageType.SessionTokenRequest: {
|
|
104
|
+
const context = await options.getContext();
|
|
105
|
+
const sessionToken = await options.getSessionToken(context);
|
|
106
|
+
if (sessionToken.length === 0) throw new FluidBridgeTokenMintError("Fluid App Bridge host returned an empty session token");
|
|
107
|
+
childWindow.postMessage({
|
|
108
|
+
id: envelope.id,
|
|
109
|
+
type: FluidBridgeMessageType.SessionTokenRespond,
|
|
110
|
+
payload: { sessionToken }
|
|
111
|
+
}, appOrigin);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
default: throw new FluidBridgeForbiddenOriginError("Fluid App Bridge host received an unsupported message type", { type: envelope.type });
|
|
115
|
+
}
|
|
116
|
+
} catch (error) {
|
|
117
|
+
childWindow.postMessage({
|
|
118
|
+
id: envelope.id,
|
|
119
|
+
type: errorTypeFor(error),
|
|
120
|
+
payload: errorPayloadFor(error)
|
|
121
|
+
}, appOrigin);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function validateRequestPayload(value, clientId) {
|
|
125
|
+
if (typeof value !== "object" || value === null) throw new FluidBridgeInvalidContextError("Fluid App Bridge request payload is invalid");
|
|
126
|
+
if (!("clientId" in value) || value.clientId !== clientId) throw new FluidBridgeFailedAuthenticationError("Fluid App Bridge request client ID does not match the host context");
|
|
127
|
+
if (!("protocol" in value) || value.protocol !== "2026-07") throw new FluidBridgeIncompatibleVersionError();
|
|
128
|
+
return value;
|
|
129
|
+
}
|
|
130
|
+
function isBridgeEnvelope(value) {
|
|
131
|
+
if (typeof value !== "object" || value === null) return false;
|
|
132
|
+
return "id" in value && "type" in value && "payload" in value && typeof value.id === "string" && typeof value.type === "string";
|
|
133
|
+
}
|
|
134
|
+
function errorTypeFor(error) {
|
|
135
|
+
if (error instanceof FluidBridgeFailedAuthenticationError) return FluidBridgeMessageType.FailedAuthentication;
|
|
136
|
+
if (error instanceof FluidBridgeIncompatibleVersionError) return FluidBridgeMessageType.IncompatibleVersion;
|
|
137
|
+
if (error instanceof FluidBridgeUnauthorizedError) return FluidBridgeMessageType.Unauthorized;
|
|
138
|
+
if (error instanceof FluidBridgeTokenMintError) return FluidBridgeMessageType.TokenMintFailed;
|
|
139
|
+
if (error instanceof FluidBridgeInvalidContextError) return FluidBridgeMessageType.InvalidContext;
|
|
140
|
+
if (error instanceof FluidBridgeForbiddenOriginError) return FluidBridgeMessageType.InvalidContext;
|
|
141
|
+
return FluidBridgeMessageType.TokenMintFailed;
|
|
142
|
+
}
|
|
143
|
+
function errorPayloadFor(error) {
|
|
144
|
+
if (error instanceof Error && "code" in error && typeof error.code === "string") return {
|
|
145
|
+
code: error.code,
|
|
146
|
+
message: error.message,
|
|
147
|
+
details: "details" in error ? error.details : void 0
|
|
148
|
+
};
|
|
149
|
+
return {
|
|
150
|
+
code: "token_mint_failed",
|
|
151
|
+
message: "Fluid App Bridge host could not complete the request",
|
|
152
|
+
details: error
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function normalizeOrigin(origin) {
|
|
156
|
+
return new URL(origin).origin;
|
|
157
|
+
}
|
|
158
|
+
//#endregion
|
|
159
|
+
//#region ../../platform/app-bridge/src/session-token-api.ts
|
|
160
|
+
const DEFAULT_SESSION_TOKEN_PATH = "api/v2025-06/app_bridge/session_token";
|
|
161
|
+
async function mintAppBridgeSessionToken({ request, apiBaseUrl, authToken, fetch: fetchImplementation = globalThis.fetch?.bind(globalThis) }) {
|
|
162
|
+
if (!fetchImplementation) throw new FluidBridgeTokenMintError("Fluid App Bridge host requires a fetch implementation to mint session tokens");
|
|
163
|
+
const response = await fetchImplementation(resolveSessionTokenUrl(apiBaseUrl), {
|
|
164
|
+
method: "POST",
|
|
165
|
+
headers: sessionTokenHeaders(authToken),
|
|
166
|
+
body: JSON.stringify(sessionTokenRequestBody(request))
|
|
167
|
+
});
|
|
168
|
+
const body = await response.json().catch(() => null);
|
|
169
|
+
if (!response.ok) throw errorForTokenResponse(response.status, body);
|
|
170
|
+
if (!isSessionTokenSuccessResponse(body) || body.session_token.length === 0) throw new FluidBridgeTokenMintError("Fluid App Bridge backend returned an invalid session token response", { body });
|
|
171
|
+
return body.session_token;
|
|
172
|
+
}
|
|
173
|
+
function sessionTokenRequestFromContext(context, sessionId) {
|
|
174
|
+
return {
|
|
175
|
+
clientId: context.app.clientId,
|
|
176
|
+
entry: context.entry,
|
|
177
|
+
resources: context.resources,
|
|
178
|
+
allowedOrigins: context.fetch.allowedOrigins,
|
|
179
|
+
...sessionId ? { sessionId } : {}
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
function sessionTokenHeaders(authToken) {
|
|
183
|
+
const headers = new Headers({
|
|
184
|
+
"Content-Type": "application/json",
|
|
185
|
+
"X-Fluid-App-Bridge-Protocol": FLUID_BRIDGE_PROTOCOL_VERSION,
|
|
186
|
+
"X-Fluid-App-Bridge-Version": APP_BRIDGE_SDK_VERSION,
|
|
187
|
+
"X-Fluid-App-Bridge-Sdk": APP_BRIDGE_SDK_NAME
|
|
188
|
+
});
|
|
189
|
+
if (authToken) headers.set("Authorization", `Bearer ${authToken}`);
|
|
190
|
+
return headers;
|
|
191
|
+
}
|
|
192
|
+
function sessionTokenRequestBody(request) {
|
|
193
|
+
return {
|
|
194
|
+
client_id: request.clientId,
|
|
195
|
+
entry: request.entry,
|
|
196
|
+
resources: request.resources ?? [],
|
|
197
|
+
allowed_origins: request.allowedOrigins ?? [],
|
|
198
|
+
...request.sessionId ? { session_id: request.sessionId } : {}
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
function resolveSessionTokenUrl(apiBaseUrl) {
|
|
202
|
+
if (!apiBaseUrl) return `/${DEFAULT_SESSION_TOKEN_PATH}`;
|
|
203
|
+
return new URL(DEFAULT_SESSION_TOKEN_PATH, ensureTrailingSlash(apiBaseUrl)).toString();
|
|
204
|
+
}
|
|
205
|
+
function ensureTrailingSlash(url) {
|
|
206
|
+
return url.endsWith("/") ? url : `${url}/`;
|
|
207
|
+
}
|
|
208
|
+
function isSessionTokenSuccessResponse(value) {
|
|
209
|
+
return typeof value === "object" && value !== null && "session_token" in value && typeof value.session_token === "string";
|
|
210
|
+
}
|
|
211
|
+
function errorForTokenResponse(status, body) {
|
|
212
|
+
const errorBody = isLegacyErrorResponse(body) ? body.error : void 0;
|
|
213
|
+
const message = errorBody?.message ?? "Fluid App Bridge backend rejected the session-token request";
|
|
214
|
+
const details = errorBody?.details ?? body;
|
|
215
|
+
if (status === 401) return new FluidBridgeUnauthorizedError(message, details);
|
|
216
|
+
if (status === 403) return new FluidBridgeFailedAuthenticationError(message, details);
|
|
217
|
+
if (status === 422) return new FluidBridgeIncompatibleVersionError(message, details);
|
|
218
|
+
return new FluidBridgeTokenMintError(message, details);
|
|
219
|
+
}
|
|
220
|
+
function isLegacyErrorResponse(value) {
|
|
221
|
+
return typeof value === "object" && value !== null && "error" in value;
|
|
222
|
+
}
|
|
223
|
+
//#endregion
|
|
10
224
|
//#region ../widgets/src/widgets/EmbedWidget.tsx
|
|
11
225
|
function isValidHttpUrl(urlString) {
|
|
12
226
|
try {
|
|
@@ -38,6 +252,13 @@ function useEmbedUrl(url, publicId) {
|
|
|
38
252
|
};
|
|
39
253
|
}, [url, publicId]);
|
|
40
254
|
}
|
|
255
|
+
function getEmbedOrigin(url) {
|
|
256
|
+
try {
|
|
257
|
+
return new URL(url).origin;
|
|
258
|
+
} catch {
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
41
262
|
function useEmbedPostMessageBridge({ iframeRef, normalizedUrl, isValidUrl, editMode }) {
|
|
42
263
|
(0, react.useEffect)(() => {
|
|
43
264
|
if (!isValidUrl || editMode) return;
|
|
@@ -207,13 +428,15 @@ const getHeaderIcon = (name) => {
|
|
|
207
428
|
if (!name) return lucide_react.GraduationCap;
|
|
208
429
|
return HEADER_ICON_MAP[name] ?? lucide_react.GraduationCap;
|
|
209
430
|
};
|
|
210
|
-
function EmbedWidget({ url = "", title = "Embedded Content", height = "400px", fullScreen = false, allowFullscreen = true, loading = "lazy", borderRadius = "md", borderWidth = "none", borderColor = "muted", editMode: _editMode, isSelected: _isSelected, displayMode = "inline", coverResource, coverUseCustomUrl = false, coverImageUrl = "", coverTitle = "", coverMeta = "", coverShowHeader = true, coverHeaderIcon = "GraduationCap", coverHeaderIconColor = "primary", coverHeight = "320px", className, ...props }) {
|
|
431
|
+
function EmbedWidget({ url = "", appBridge, title = "Embedded Content", height = "400px", fullScreen = false, allowFullscreen = true, loading = "lazy", borderRadius = "md", borderWidth = "none", borderColor = "muted", editMode: _editMode, isSelected: _isSelected, displayMode = "inline", coverResource, coverUseCustomUrl = false, coverImageUrl = "", coverTitle = "", coverMeta = "", coverShowHeader = true, coverHeaderIcon = "GraduationCap", coverHeaderIconColor = "primary", coverHeight = "320px", className, ...props }) {
|
|
211
432
|
const renderState = require_WidgetRenderStateContext.useWidgetRenderState();
|
|
212
433
|
const editMode = _editMode ?? renderState.editMode;
|
|
213
434
|
const isSelected = _isSelected ?? renderState.isSelected;
|
|
214
435
|
const isFullScreen = fullScreen;
|
|
215
436
|
const iframeRef = (0, react.useRef)(null);
|
|
216
|
-
const
|
|
437
|
+
const repUser = require_RepUserContext.useRepUser();
|
|
438
|
+
const publicId = repUser?.publicId;
|
|
439
|
+
const { data: store } = require_use_optional_store.useOptionalStore();
|
|
217
440
|
const [modalOpen, setModalOpen] = (0, react.useState)(false);
|
|
218
441
|
const [coverReloadKey, setCoverReloadKey] = (0, react.useState)(0);
|
|
219
442
|
const [iframeReloadKey, setIframeReloadKey] = (0, react.useState)(0);
|
|
@@ -226,6 +449,80 @@ function EmbedWidget({ url = "", title = "Embedded Content", height = "400px", f
|
|
|
226
449
|
isValidUrl,
|
|
227
450
|
editMode
|
|
228
451
|
});
|
|
452
|
+
const appBridgeClientId = appBridge?.clientId;
|
|
453
|
+
const appBridgeEntryType = appBridge?.entryType;
|
|
454
|
+
const appBridgeEntryName = appBridge?.entryName;
|
|
455
|
+
const appBridgeResources = appBridge?.resources;
|
|
456
|
+
const appBridgeAppOrigins = appBridge?.appOrigins;
|
|
457
|
+
const appBridgeContext = (0, react.useMemo)(() => {
|
|
458
|
+
if (!appBridgeClientId || !store || !isValidUrl) return null;
|
|
459
|
+
return {
|
|
460
|
+
protocol: FLUID_BRIDGE_PROTOCOL_VERSION,
|
|
461
|
+
app: { clientId: appBridgeClientId },
|
|
462
|
+
store: {
|
|
463
|
+
subdomain: store.subdomain,
|
|
464
|
+
url: `https://${store.subdomain}.fluid.app`,
|
|
465
|
+
name: store.name
|
|
466
|
+
},
|
|
467
|
+
...repUser ? { actor: {
|
|
468
|
+
type: "member",
|
|
469
|
+
...repUser.publicId ? { uuid: repUser.publicId } : {},
|
|
470
|
+
roles: [],
|
|
471
|
+
permissions: []
|
|
472
|
+
} } : {},
|
|
473
|
+
entry: {
|
|
474
|
+
type: appBridgeEntryType ?? "portal_embed",
|
|
475
|
+
name: appBridgeEntryName ?? title
|
|
476
|
+
},
|
|
477
|
+
resources: appBridgeResources ?? [],
|
|
478
|
+
fetch: { allowedOrigins: [getEmbedOrigin(normalizedUrl), ...appBridgeAppOrigins ?? []].filter((origin) => Boolean(origin)) },
|
|
479
|
+
sdk: { minVersion: APP_BRIDGE_SDK_VERSION }
|
|
480
|
+
};
|
|
481
|
+
}, [
|
|
482
|
+
appBridgeAppOrigins,
|
|
483
|
+
appBridgeClientId,
|
|
484
|
+
appBridgeEntryName,
|
|
485
|
+
appBridgeEntryType,
|
|
486
|
+
appBridgeResources,
|
|
487
|
+
isValidUrl,
|
|
488
|
+
normalizedUrl,
|
|
489
|
+
repUser,
|
|
490
|
+
store,
|
|
491
|
+
title
|
|
492
|
+
]);
|
|
493
|
+
const appBridgeContextRef = (0, react.useRef)(null);
|
|
494
|
+
const appBridgeContextReady = appBridgeContext !== null;
|
|
495
|
+
(0, react.useEffect)(() => {
|
|
496
|
+
appBridgeContextRef.current = appBridgeContext;
|
|
497
|
+
}, [appBridgeContext]);
|
|
498
|
+
const getAppBridgeContext = (0, react.useCallback)(() => {
|
|
499
|
+
if (!appBridgeContextRef.current) throw new Error("App Bridge context is unavailable");
|
|
500
|
+
return appBridgeContextRef.current;
|
|
501
|
+
}, []);
|
|
502
|
+
const getAppBridgeSessionToken = (0, react.useCallback)((bridgeContext) => mintAppBridgeSessionToken({ request: sessionTokenRequestFromContext(bridgeContext) }), []);
|
|
503
|
+
(0, react.useEffect)(() => {
|
|
504
|
+
if (!appBridgeClientId || !appBridgeContextReady || editMode) return;
|
|
505
|
+
const iframe = iframeRef.current;
|
|
506
|
+
const appOrigin = getEmbedOrigin(normalizedUrl);
|
|
507
|
+
if (!iframe || !appOrigin) return;
|
|
508
|
+
const host = createFluidBridgeHost({
|
|
509
|
+
iframe,
|
|
510
|
+
appOrigin,
|
|
511
|
+
clientId: appBridgeClientId,
|
|
512
|
+
getContext: getAppBridgeContext,
|
|
513
|
+
getSessionToken: getAppBridgeSessionToken
|
|
514
|
+
});
|
|
515
|
+
return () => host.destroy();
|
|
516
|
+
}, [
|
|
517
|
+
appBridgeClientId,
|
|
518
|
+
appBridgeContextReady,
|
|
519
|
+
editMode,
|
|
520
|
+
getAppBridgeContext,
|
|
521
|
+
getAppBridgeSessionToken,
|
|
522
|
+
iframeReloadKey,
|
|
523
|
+
modalOpen,
|
|
524
|
+
normalizedUrl
|
|
525
|
+
]);
|
|
229
526
|
useModalBodyScrollLock(modalOpen);
|
|
230
527
|
useModalEscapeClose(modalOpen, closeModal);
|
|
231
528
|
const embedability = useEmbedability(normalizedUrl, isValidUrl, editMode && displayMode !== "cover");
|
|
@@ -713,4 +1010,4 @@ Object.defineProperty(exports, "embedWidgetPropertySchema", {
|
|
|
713
1010
|
}
|
|
714
1011
|
});
|
|
715
1012
|
|
|
716
|
-
//# sourceMappingURL=EmbedWidget-
|
|
1013
|
+
//# sourceMappingURL=EmbedWidget-D1lbYjuL.cjs.map
|