@wildo-ai/presets-components 1.1.5 → 1.1.6
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/esm/.native.tsbuildinfo +1 -0
- package/dist/esm/components/actions/action-bar.d.ts.map +1 -1
- package/dist/esm/components/actions/action-bar.js +5 -2
- package/dist/esm/components/actions/action-bar.js.map +1 -1
- package/dist/esm/components/ai-elements/chat/suggestion.d.ts.map +1 -1
- package/dist/esm/components/ai-elements/chat/suggestion.js +8 -1
- package/dist/esm/components/ai-elements/chat/suggestion.js.map +1 -1
- package/dist/esm/components/ai-elements/decision/approval.d.ts +108 -13
- package/dist/esm/components/ai-elements/decision/approval.d.ts.map +1 -1
- package/dist/esm/components/ai-elements/decision/approval.js +60 -10
- package/dist/esm/components/ai-elements/decision/approval.js.map +1 -1
- package/dist/esm/components/ai-elements/graph/graph-runtime.d.ts +3 -1
- package/dist/esm/components/ai-elements/graph/graph-runtime.d.ts.map +1 -1
- package/dist/esm/components/ai-elements/graph/graph-runtime.js +3 -1
- package/dist/esm/components/ai-elements/graph/graph-runtime.js.map +1 -1
- package/dist/esm/components/app/app-layout-main-container.d.ts +9 -0
- package/dist/esm/components/app/app-layout-main-container.d.ts.map +1 -1
- package/dist/esm/components/app/app-layout-main-container.js +17 -23
- package/dist/esm/components/app/app-layout-main-container.js.map +1 -1
- package/dist/esm/components/app/app-layout-main-container.labels.d.ts.map +1 -1
- package/dist/esm/components/app/app-layout-main-container.labels.js +27 -0
- package/dist/esm/components/app/app-layout-main-container.labels.js.map +1 -1
- package/dist/esm/components/billing/billing-plan-change-preview.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-plan-change-preview.js +5 -2
- package/dist/esm/components/billing/billing-plan-change-preview.js.map +1 -1
- package/dist/esm/components/billing/billing-plan-change-preview.labels.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-plan-change-preview.labels.js +3 -0
- package/dist/esm/components/billing/billing-plan-change-preview.labels.js.map +1 -1
- package/dist/esm/components/billing/billing-pricing-table.d.ts +1 -1
- package/dist/esm/components/billing/billing-pricing-table.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-pricing-table.js +8 -4
- package/dist/esm/components/billing/billing-pricing-table.js.map +1 -1
- package/dist/esm/components/billing/billing-pricing-table.labels.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-pricing-table.labels.js +7 -1
- package/dist/esm/components/billing/billing-pricing-table.labels.js.map +1 -1
- package/dist/esm/components/billing/billing-usage-dashboard.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-usage-dashboard.js +6 -3
- package/dist/esm/components/billing/billing-usage-dashboard.js.map +1 -1
- package/dist/esm/components/billing/billing-usage-dashboard.labels.d.ts.map +1 -1
- package/dist/esm/components/billing/billing-usage-dashboard.labels.js +2 -1
- package/dist/esm/components/billing/billing-usage-dashboard.labels.js.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-enum.d.ts.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-enum.js +18 -4
- package/dist/esm/components/data-display/formatters/display-field-enum.js.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-file.d.ts.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-file.js +13 -14
- package/dist/esm/components/data-display/formatters/display-field-file.js.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-file.labels.d.ts.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-file.labels.js +1 -0
- package/dist/esm/components/data-display/formatters/display-field-file.labels.js.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-number.d.ts.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-number.js +6 -1
- package/dist/esm/components/data-display/formatters/display-field-number.js.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-number.labels.d.ts.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-number.labels.js +5 -2
- package/dist/esm/components/data-display/formatters/display-field-number.labels.js.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-string.d.ts +1 -1
- package/dist/esm/components/data-display/formatters/display-field-string.d.ts.map +1 -1
- package/dist/esm/components/data-display/formatters/display-field-string.js +51 -12
- package/dist/esm/components/data-display/formatters/display-field-string.js.map +1 -1
- package/dist/esm/components/data-display/untrusted-html-content.d.ts +55 -0
- package/dist/esm/components/data-display/untrusted-html-content.d.ts.map +1 -0
- package/dist/esm/components/data-display/untrusted-html-content.js +67 -0
- package/dist/esm/components/data-display/untrusted-html-content.js.map +1 -0
- package/dist/esm/components/form/chromes/form-primitive.labels.d.ts.map +1 -1
- package/dist/esm/components/form/chromes/form-primitive.labels.js +9 -0
- package/dist/esm/components/form/chromes/form-primitive.labels.js.map +1 -1
- package/dist/esm/components/form/combobox.d.ts.map +1 -1
- package/dist/esm/components/form/combobox.js +10 -10
- package/dist/esm/components/form/combobox.js.map +1 -1
- package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.d.ts +42 -0
- package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.d.ts.map +1 -0
- package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.js +120 -0
- package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.js.map +1 -0
- package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.d.ts +16 -0
- package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.d.ts.map +1 -0
- package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.js +8 -0
- package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.js.map +1 -0
- package/dist/esm/components/navigation/app-level/activity-bar.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/activity-bar.js +2 -2
- package/dist/esm/components/navigation/app-level/activity-bar.js.map +1 -1
- package/dist/esm/components/navigation/app-level/menu-user-org.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/menu-user-org.js +10 -4
- package/dist/esm/components/navigation/app-level/menu-user-org.js.map +1 -1
- package/dist/esm/components/navigation/app-level/menu-user-org.labels.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/menu-user-org.labels.js +7 -0
- package/dist/esm/components/navigation/app-level/menu-user-org.labels.js.map +1 -1
- package/dist/esm/components/navigation/app-level/menubar.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/menubar.js +6 -6
- package/dist/esm/components/navigation/app-level/menubar.js.map +1 -1
- package/dist/esm/components/navigation/app-level/navigation-back.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/navigation-back.js +27 -9
- package/dist/esm/components/navigation/app-level/navigation-back.js.map +1 -1
- package/dist/esm/components/navigation/app-level/sidebar.js +3 -3
- package/dist/esm/components/navigation/app-level/sidebar.js.map +1 -1
- package/dist/esm/components/navigation/app-level/status-bar.js +2 -2
- package/dist/esm/components/navigation/app-level/status-bar.js.map +1 -1
- package/dist/esm/components/navigation/app-level/toolbar.d.ts.map +1 -1
- package/dist/esm/components/navigation/app-level/toolbar.js +2 -2
- package/dist/esm/components/navigation/app-level/toolbar.js.map +1 -1
- package/dist/esm/components/navigation/app-level/utility-panel.js +2 -2
- package/dist/esm/components/navigation/app-level/utility-panel.js.map +1 -1
- package/dist/esm/components/navigation/breadcrumb.js +1 -1
- package/dist/esm/components/navigation/breadcrumb.js.map +1 -1
- package/dist/esm/components/sections/stepper.d.ts.map +1 -1
- package/dist/esm/components/sections/stepper.js +5 -3
- package/dist/esm/components/sections/stepper.js.map +1 -1
- package/dist/esm/config/preset-navigation.d.ts.map +1 -1
- package/dist/esm/config/preset-navigation.js +23 -2
- package/dist/esm/config/preset-navigation.js.map +1 -1
- package/dist/esm/config/resources/agent-work.resource-presets.d.ts +4 -0
- package/dist/esm/config/resources/agent-work.resource-presets.d.ts.map +1 -0
- package/dist/esm/config/resources/agent-work.resource-presets.js +115 -0
- package/dist/esm/config/resources/agent-work.resource-presets.js.map +1 -0
- package/dist/esm/config/resources/api-key-rotation-window.d.ts +22 -0
- package/dist/esm/config/resources/api-key-rotation-window.d.ts.map +1 -0
- package/dist/esm/config/resources/api-key-rotation-window.js +45 -0
- package/dist/esm/config/resources/api-key-rotation-window.js.map +1 -0
- package/dist/esm/config/resources/application.resource-presets.d.ts.map +1 -1
- package/dist/esm/config/resources/application.resource-presets.js +147 -61
- package/dist/esm/config/resources/application.resource-presets.js.map +1 -1
- package/dist/esm/config/resources/billing.resource-presets.d.ts +4 -3
- package/dist/esm/config/resources/billing.resource-presets.d.ts.map +1 -1
- package/dist/esm/config/resources/billing.resource-presets.js +240 -111
- package/dist/esm/config/resources/billing.resource-presets.js.map +1 -1
- package/dist/esm/config/resources/conversation-threads.resource-presets.d.ts +4 -0
- package/dist/esm/config/resources/conversation-threads.resource-presets.d.ts.map +1 -0
- package/dist/esm/config/resources/conversation-threads.resource-presets.js +105 -0
- package/dist/esm/config/resources/conversation-threads.resource-presets.js.map +1 -0
- package/dist/esm/config/resources/guidance.resource-presets.d.ts.map +1 -1
- package/dist/esm/config/resources/guidance.resource-presets.js +18 -11
- package/dist/esm/config/resources/guidance.resource-presets.js.map +1 -1
- package/dist/esm/config/resources/identity.resource-presets.d.ts +0 -13
- package/dist/esm/config/resources/identity.resource-presets.d.ts.map +1 -1
- package/dist/esm/config/resources/identity.resource-presets.js +48 -16
- package/dist/esm/config/resources/identity.resource-presets.js.map +1 -1
- package/dist/esm/config/resources/inbound-deliveries.resource-presets.d.ts +6 -0
- package/dist/esm/config/resources/inbound-deliveries.resource-presets.d.ts.map +1 -0
- package/dist/esm/config/resources/inbound-deliveries.resource-presets.js +112 -0
- package/dist/esm/config/resources/inbound-deliveries.resource-presets.js.map +1 -0
- package/dist/esm/config/resources/inbound-email.resource-presets.d.ts +4 -0
- package/dist/esm/config/resources/inbound-email.resource-presets.d.ts.map +1 -0
- package/dist/esm/config/resources/inbound-email.resource-presets.js +182 -0
- package/dist/esm/config/resources/inbound-email.resource-presets.js.map +1 -0
- package/dist/esm/config/resources/index.d.ts.map +1 -1
- package/dist/esm/config/resources/index.js +9 -2
- package/dist/esm/config/resources/index.js.map +1 -1
- package/dist/esm/config/resources/legal-holds.resource-presets.d.ts +4 -0
- package/dist/esm/config/resources/legal-holds.resource-presets.d.ts.map +1 -0
- package/dist/esm/config/resources/legal-holds.resource-presets.js +76 -0
- package/dist/esm/config/resources/legal-holds.resource-presets.js.map +1 -0
- package/dist/esm/config/resources/organizations.resource-presets.d.ts.map +1 -1
- package/dist/esm/config/resources/organizations.resource-presets.js +139 -36
- package/dist/esm/config/resources/organizations.resource-presets.js.map +1 -1
- package/dist/esm/config/resources/resource.config.utils.d.ts +20 -0
- package/dist/esm/config/resources/resource.config.utils.d.ts.map +1 -1
- package/dist/esm/config/resources/resource.config.utils.js +20 -0
- package/dist/esm/config/resources/resource.config.utils.js.map +1 -1
- package/dist/esm/config/resources/retention-enforcement.resource-presets.d.ts +5 -0
- package/dist/esm/config/resources/retention-enforcement.resource-presets.d.ts.map +1 -0
- package/dist/esm/config/resources/retention-enforcement.resource-presets.js +74 -0
- package/dist/esm/config/resources/retention-enforcement.resource-presets.js.map +1 -0
- package/dist/esm/config/resources/security.resource-presets.d.ts +3 -1
- package/dist/esm/config/resources/security.resource-presets.d.ts.map +1 -1
- package/dist/esm/config/resources/security.resource-presets.js +563 -133
- package/dist/esm/config/resources/security.resource-presets.js.map +1 -1
- package/dist/esm/config/resources/service-providers.resource-presets.d.ts +4 -0
- package/dist/esm/config/resources/service-providers.resource-presets.d.ts.map +1 -0
- package/dist/esm/config/resources/service-providers.resource-presets.js +321 -0
- package/dist/esm/config/resources/service-providers.resource-presets.js.map +1 -0
- package/dist/esm/config/resources/webhooks.resource-presets.d.ts +4 -3
- package/dist/esm/config/resources/webhooks.resource-presets.d.ts.map +1 -1
- package/dist/esm/config/resources/webhooks.resource-presets.js +76 -25
- package/dist/esm/config/resources/webhooks.resource-presets.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/registration/register-common-enums.d.ts.map +1 -1
- package/dist/esm/registration/register-common-enums.js +15 -0
- package/dist/esm/registration/register-common-enums.js.map +1 -1
- package/dist/esm/registration/register-provider-components.d.ts.map +1 -1
- package/dist/esm/registration/register-provider-components.js +6 -0
- package/dist/esm/registration/register-provider-components.js.map +1 -1
- package/dist/esm/themes/dense.theme.d.ts.map +1 -1
- package/dist/esm/themes/dense.theme.js +22 -2
- package/dist/esm/themes/dense.theme.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +8 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breadcrumb.js","sourceRoot":"","sources":["../../../../../src/components/navigation/breadcrumb.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"breadcrumb.js","sourceRoot":"","sources":["../../../../../src/components/navigation/breadcrumb.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\"\nimport type { BreadcrumbLinkProps } from \"@wildo-ai/saas-frontend-lib\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { FrontendComponentType } from \"@wildo-ai/presets-components-models\"\n\nimport { cn, useIconRegistry, StandardIconReference, IconSize, useI18n, useUI, createCompoundPreset, type BreadcrumbCompound } from \"@wildo-ai/saas-frontend-lib\"\nimport { UIBehavior, TypographyVariant, InteractiveVariant } from \"@wildo-ai/presets-components-models\"\n\nfunction BreadcrumbRoot({ ...props }: React.ComponentProps<\"nav\">): React.JSX.Element {\n const { tComponent } = useI18n({ component: FrontendComponentType.LOW_LEVEL_BREADCRUMB })\n const ariaLabel = tComponent(FrontendComponentType.LOW_LEVEL_BREADCRUMB, 'ariaLabel')\n\n return <nav aria-label={ariaLabel} data-slot=\"breadcrumb\" {...props} />\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<\"ol\">): React.JSX.Element {\n const { getRecipe } = useUI()\n const recipe = getRecipe(UIBehavior.TYPOGRAPHY, TypographyVariant.DESCRIPTION)\n\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n \"flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5\",\n recipe.base,\n className\n )}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<\"li\">): React.JSX.Element {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\"inline-flex items-center gap-1.5\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbLink({\n asChild,\n className,\n ...props\n}: BreadcrumbLinkProps): React.JSX.Element {\n const Comp = asChild ? Slot : \"a\"\n const { getRecipe } = useUI()\n const recipe = getRecipe(UIBehavior.INTERACTIVE, InteractiveVariant.LINK)\n\n return (\n <Comp\n data-slot=\"breadcrumb-link\"\n className={cn(\"hover:text-foreground\", recipe.motion.transition, className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<\"span\">): React.JSX.Element {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\"text-foreground font-normal\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">): React.JSX.Element {\n const { renderIcon } = useIconRegistry()\n\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? renderIcon(StandardIconReference.CHEVRON_RIGHT, { size: IconSize.SM, className: \"rtl:rotate-180\" })}\n </li>\n )\n}\n\nfunction BreadcrumbEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">): React.JSX.Element {\n const { renderIcon } = useIconRegistry()\n const { tComponent } = useI18n({ component: FrontendComponentType.LOW_LEVEL_BREADCRUMB })\n const moreLabel = tComponent(FrontendComponentType.LOW_LEVEL_BREADCRUMB, 'more')\n\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n className={cn(\"flex size-9 items-center justify-center\", className)}\n {...props}\n >\n {/* Only the glyph is hidden. `aria-hidden` used to sit on this whole span, which also hid the\n sr-only label beside it — so the \"more\" a screen reader was meant to hear was never read. */}\n <span aria-hidden=\"true\">{renderIcon(StandardIconReference.MORE_HORIZONTAL, { size: IconSize.SM })}</span>\n <span className=\"sr-only\">{moreLabel}</span>\n </span>\n )\n}\n\nexport const Breadcrumb = createCompoundPreset<BreadcrumbCompound>(BreadcrumbRoot, {\n List: BreadcrumbList,\n Item: BreadcrumbItem,\n Link: BreadcrumbLink,\n Page: BreadcrumbPage,\n Separator: BreadcrumbSeparator,\n Ellipsis: BreadcrumbEllipsis,\n})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepper.d.ts","sourceRoot":"","sources":["../../../../../src/components/sections/stepper.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAOV,eAAe,EAChB,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"stepper.d.ts","sourceRoot":"","sources":["../../../../../src/components/sections/stepper.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAOV,eAAe,EAChB,MAAM,6BAA6B,CAAA;AA8NpC,eAAO,MAAM,OAAO,iBAA4L,CAAA"}
|
|
@@ -37,7 +37,9 @@ function StepperIndicator({ step, className, ...props }) {
|
|
|
37
37
|
const { renderIcon } = useIconRegistry();
|
|
38
38
|
const completed = isCompleted(step);
|
|
39
39
|
const current = isCurrent(step);
|
|
40
|
-
return (_jsx("div", { "data-slot": "stepper-indicator", "data-step": step, "data-state": completed ? "completed" : current ? "current" : "pending", className: cn("flex h-8 w-8 shrink-0 items-center justify-center rounded-full border-2 transition-all", completed && "border-primary bg-primary text-primary-foreground", current && "border-primary bg-background text-primary", !completed && !current && "border-muted-foreground/30 bg-background text-muted-foreground", className), ...props, children: completed ? (renderIcon(StandardIconReference.CHECK, { size: IconSize.SM })) : (
|
|
40
|
+
return (_jsx("div", { "data-slot": "stepper-indicator", "data-step": step, "data-state": completed ? "completed" : current ? "current" : "pending", className: cn("flex h-8 w-8 shrink-0 items-center justify-center rounded-full border-2 transition-all", completed && "border-primary bg-primary text-primary-foreground", current && "border-primary bg-background text-primary", !completed && !current && "border-muted-foreground/30 bg-background text-muted-foreground", className), ...props, children: completed ? (renderIcon(StandardIconReference.CHECK, { size: IconSize.SM })) : (
|
|
41
|
+
// `step` is a 0-based POSITION (the same base as `currentStep`); a person counts from 1.
|
|
42
|
+
_jsx("span", { className: "text-sm font-semibold", children: step + 1 })) }));
|
|
41
43
|
}
|
|
42
44
|
// ============================================================================
|
|
43
45
|
// StepperSeparator
|
|
@@ -45,8 +47,8 @@ function StepperIndicator({ step, className, ...props }) {
|
|
|
45
47
|
function StepperSeparator({ step, className, ...props }) {
|
|
46
48
|
const { isCompleted, orientation, totalSteps } = useStepperContext();
|
|
47
49
|
const completed = isCompleted(step);
|
|
48
|
-
// Don't render separator after the last step
|
|
49
|
-
if (step >= totalSteps)
|
|
50
|
+
// Don't render a separator after the last step (0-based: the last position is `totalSteps - 1`).
|
|
51
|
+
if (step >= totalSteps - 1)
|
|
50
52
|
return null;
|
|
51
53
|
return (_jsx("div", { "data-slot": "stepper-separator", "data-step": step, "data-state": completed ? "completed" : "pending", className: cn("transition-all", orientation === DisplayDirection.VERTICAL && "w-0.5 h-12 mt-item", orientation === DisplayDirection.HORIZONTAL && "h-0.5 flex-1 mx-field", completed ? "bg-primary" : "bg-muted-foreground/30", className), ...props }));
|
|
52
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepper.js","sourceRoot":"","sources":["../../../../../src/components/sections/stepper.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport type {\n StepperProps,\n StepperItemProps,\n StepperIndicatorProps,\n StepperSeparatorProps,\n StepperTitleProps,\n StepperDescriptionProps,\n StepperCompound,\n} from \"@wildo-ai/saas-frontend-lib\"\nimport { createCompoundPreset, cn, useIconRegistry, StandardIconReference, IconSize, useUI } from \"@wildo-ai/saas-frontend-lib\"\nimport { FrontendComponentType, TypographyVariant, UIBehavior } from \"@wildo-ai/presets-components-models\"\nimport { DisplayDirection } from \"@wildo-ai/zod-decorators\"\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface StepperContextType {\n currentStep: number\n totalSteps: number\n orientation: DisplayDirection\n isCompleted: (step: number) => boolean\n isCurrent: (step: number) => boolean\n completedSteps?: Set<number>\n}\n\nconst StepperContext = React.createContext<StepperContextType | undefined>(undefined)\n\nfunction useStepperContext(): StepperContextType | undefined {\n const context = React.useContext(StepperContext)\n if (!context) {\n throw new Error(\"Stepper components must be used within a Stepper\")\n }\n return context\n}\n\n// ============================================================================\n// Stepper (Root)\n// ============================================================================\n\nfunction StepperRoot({\n currentStep,\n totalSteps,\n orientation = DisplayDirection.VERTICAL,\n completedSteps,\n className,\n children,\n ...props\n}: StepperProps): React.JSX.Element {\n const isCompleted = (step: number) => completedSteps?.has(step) || step < currentStep\n const isCurrent = (step: number) => step === currentStep\n\n return (\n <StepperContext.Provider value={{ currentStep, totalSteps, orientation, isCompleted, isCurrent, completedSteps }}>\n <div\n data-slot=\"stepper\"\n data-orientation={orientation}\n className={cn(\n \"w-full\",\n orientation === DisplayDirection.HORIZONTAL && \"flex items-center justify-between\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </StepperContext.Provider>\n )\n}\n\n// ============================================================================\n// StepperItem\n// ============================================================================\n\nfunction StepperItem({\n step,\n className,\n children,\n ...props\n}: StepperItemProps): React.JSX.Element {\n const { isCompleted, isCurrent, orientation, totalSteps } = useStepperContext()\n const completed = isCompleted(step)\n const current = isCurrent(step)\n\n return (\n <div\n data-slot=\"stepper-item\"\n data-step={step}\n data-state={completed ? \"completed\" : current ? \"current\" : \"pending\"}\n className={cn(\n orientation === DisplayDirection.VERTICAL && \"flex items-start gap-field\",\n orientation === DisplayDirection.HORIZONTAL && \"flex flex-col items-center gap-element\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n}\n\n// ============================================================================\n// StepperIndicator\n// ============================================================================\n\nfunction StepperIndicator({\n step,\n className,\n ...props\n}: StepperIndicatorProps): React.JSX.Element {\n const { isCompleted, isCurrent } = useStepperContext()\n const { renderIcon } = useIconRegistry()\n const completed = isCompleted(step)\n const current = isCurrent(step)\n\n return (\n <div\n data-slot=\"stepper-indicator\"\n data-step={step}\n data-state={completed ? \"completed\" : current ? \"current\" : \"pending\"}\n className={cn(\n \"flex h-8 w-8 shrink-0 items-center justify-center rounded-full border-2 transition-all\",\n completed && \"border-primary bg-primary text-primary-foreground\",\n current && \"border-primary bg-background text-primary\",\n !completed && !current && \"border-muted-foreground/30 bg-background text-muted-foreground\",\n className\n )}\n {...props}\n >\n {completed ? (\n renderIcon(StandardIconReference.CHECK, { size: IconSize.SM })\n ) : (\n <span className=\"text-sm font-semibold\">{step}</span>\n )}\n </div>\n )\n}\n\n// ============================================================================\n// StepperSeparator\n// ============================================================================\n\nfunction StepperSeparator({\n step,\n className,\n ...props\n}: StepperSeparatorProps): React.JSX.Element {\n const { isCompleted, orientation, totalSteps } = useStepperContext()\n const completed = isCompleted(step)\n\n // Don't render separator after the last step\n if (step >= totalSteps) return null\n\n return (\n <div\n data-slot=\"stepper-separator\"\n data-step={step}\n data-state={completed ? \"completed\" : \"pending\"}\n className={cn(\n \"transition-all\",\n orientation === DisplayDirection.VERTICAL && \"w-0.5 h-12 mt-item\",\n orientation === DisplayDirection.HORIZONTAL && \"h-0.5 flex-1 mx-field\",\n completed ? \"bg-primary\" : \"bg-muted-foreground/30\",\n className\n )}\n {...props}\n />\n )\n}\n\n// ============================================================================\n// StepperTitle\n// ============================================================================\n\nfunction StepperTitle({\n step,\n className,\n children,\n ...props\n}: StepperTitleProps): React.JSX.Element {\n const { isCurrent } = useStepperContext()\n const current = isCurrent(step)\n\n return (\n <h4\n data-slot=\"stepper-title\"\n data-step={step}\n data-state={current ? \"current\" : \"inactive\"}\n className={cn(\n \"text-sm font-medium transition-colors\",\n current ? \"text-foreground\" : \"text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </h4>\n )\n}\n\n// ============================================================================\n// StepperDescription\n// ============================================================================\n\nfunction StepperDescription({\n step,\n className,\n children,\n ...props\n}: StepperDescriptionProps): React.JSX.Element {\n const { getRecipe } = useUI()\n const recipe = getRecipe(UIBehavior.TYPOGRAPHY, TypographyVariant.DESCRIPTION)\n\n return (\n <p\n data-slot=\"stepper-description\"\n data-step={step}\n className={cn(\n \"text-xs mt-item-xs\",\n recipe.base,\n className\n )}\n {...props}\n >\n {children}\n </p>\n )\n}\n\nexport const Stepper = createCompoundPreset<StepperCompound>(StepperRoot, { Item: StepperItem, Indicator: StepperIndicator, Separator: StepperSeparator, Title: StepperTitle, Description: StepperDescription })\n\n"]}
|
|
1
|
+
{"version":3,"file":"stepper.js","sourceRoot":"","sources":["../../../../../src/components/sections/stepper.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAU9B,OAAO,EAAE,oBAAoB,EAAE,EAAE,EAAE,eAAe,EAAE,qBAAqB,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAA;AAC/H,OAAO,EAAyB,iBAAiB,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAA;AAC1G,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAe3D,MAAM,cAAc,GAAG,KAAK,CAAC,aAAa,CAAiC,SAAS,CAAC,CAAA;AAErF,SAAS,iBAAiB;IACxB,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;IAChD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;IACrE,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,SAAS,WAAW,CAAC,EACnB,WAAW,EACX,UAAU,EACV,WAAW,GAAG,gBAAgB,CAAC,QAAQ,EACvC,cAAc,EACd,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACK;IACb,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,WAAW,CAAA;IACrF,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,KAAK,WAAW,CAAA;IAExD,OAAO,CACL,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,YAC9G,2BACY,SAAS,sBACD,WAAW,EAC7B,SAAS,EAAE,EAAE,CACX,QAAQ,EACR,WAAW,KAAK,gBAAgB,CAAC,UAAU,IAAI,mCAAmC,EAClF,SAAS,CACV,KACG,KAAK,YAER,QAAQ,GACL,GACkB,CAC3B,CAAA;AACH,CAAC;AAED,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E,SAAS,WAAW,CAAC,EACnB,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACS;IACjB,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,iBAAiB,EAAE,CAAA;IAC/E,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IACnC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAE/B,OAAO,CACL,2BACY,cAAc,eACb,IAAI,gBACH,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EACrE,SAAS,EAAE,EAAE,CACX,WAAW,KAAK,gBAAgB,CAAC,QAAQ,IAAI,4BAA4B,EACzE,WAAW,KAAK,gBAAgB,CAAC,UAAU,IAAI,wCAAwC,EACvF,SAAS,CACV,KACG,KAAK,YAER,QAAQ,GACL,CACP,CAAA;AACH,CAAC;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,SAAS,gBAAgB,CAAC,EACxB,IAAI,EACJ,SAAS,EACT,GAAG,KAAK,EACc;IACtB,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,iBAAiB,EAAE,CAAA;IACtD,MAAM,EAAE,UAAU,EAAE,GAAG,eAAe,EAAE,CAAA;IACxC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IACnC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAE/B,OAAO,CACL,2BACY,mBAAmB,eAClB,IAAI,gBACH,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EACrE,SAAS,EAAE,EAAE,CACX,wFAAwF,EACxF,SAAS,IAAI,mDAAmD,EAChE,OAAO,IAAI,2CAA2C,EACtD,CAAC,SAAS,IAAI,CAAC,OAAO,IAAI,gEAAgE,EAC1F,SAAS,CACV,KACG,KAAK,YAER,SAAS,CAAC,CAAC,CAAC,CACX,UAAU,CAAC,qBAAqB,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAC/D,CAAC,CAAC,CAAC;QACF,yFAAyF;QACzF,eAAM,SAAS,EAAC,uBAAuB,YAAE,IAAI,GAAG,CAAC,GAAQ,CAC1D,GACG,CACP,CAAA;AACH,CAAC;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,SAAS,gBAAgB,CAAC,EACxB,IAAI,EACJ,SAAS,EACT,GAAG,KAAK,EACc;IACtB,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,iBAAiB,EAAE,CAAA;IACpE,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IAEnC,iGAAiG;IACjG,IAAI,IAAI,IAAI,UAAU,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IAEvC,OAAO,CACL,2BACY,mBAAmB,eAClB,IAAI,gBACH,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EAC/C,SAAS,EAAE,EAAE,CACX,gBAAgB,EAChB,WAAW,KAAK,gBAAgB,CAAC,QAAQ,IAAI,oBAAoB,EACjE,WAAW,KAAK,gBAAgB,CAAC,UAAU,IAAI,uBAAuB,EACtE,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,wBAAwB,EACnD,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E,SAAS,YAAY,CAAC,EACpB,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACU;IAClB,MAAM,EAAE,SAAS,EAAE,GAAG,iBAAiB,EAAE,CAAA;IACzC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAE/B,OAAO,CACL,0BACY,eAAe,eACd,IAAI,gBACH,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAC5C,SAAS,EAAE,EAAE,CACX,uCAAuC,EACvC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,uBAAuB,EACrD,SAAS,CACV,KACG,KAAK,YAER,QAAQ,GACN,CACN,CAAA;AACH,CAAC;AAED,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,SAAS,kBAAkB,CAAC,EAC1B,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACgB;IACxB,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,CAAA;IAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAA;IAE9E,OAAO,CACL,yBACY,qBAAqB,eACpB,IAAI,EACf,SAAS,EAAE,EAAE,CACX,oBAAoB,EACpB,MAAM,CAAC,IAAI,EACX,SAAS,CACV,KACG,KAAK,YAER,QAAQ,GACP,CACL,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,oBAAoB,CAAkB,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC,CAAA","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport type {\n StepperProps,\n StepperItemProps,\n StepperIndicatorProps,\n StepperSeparatorProps,\n StepperTitleProps,\n StepperDescriptionProps,\n StepperCompound,\n} from \"@wildo-ai/saas-frontend-lib\"\nimport { createCompoundPreset, cn, useIconRegistry, StandardIconReference, IconSize, useUI } from \"@wildo-ai/saas-frontend-lib\"\nimport { FrontendComponentType, TypographyVariant, UIBehavior } from \"@wildo-ai/presets-components-models\"\nimport { DisplayDirection } from \"@wildo-ai/zod-decorators\"\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface StepperContextType {\n currentStep: number\n totalSteps: number\n orientation: DisplayDirection\n isCompleted: (step: number) => boolean\n isCurrent: (step: number) => boolean\n completedSteps?: Set<number>\n}\n\nconst StepperContext = React.createContext<StepperContextType | undefined>(undefined)\n\nfunction useStepperContext(): StepperContextType | undefined {\n const context = React.useContext(StepperContext)\n if (!context) {\n throw new Error(\"Stepper components must be used within a Stepper\")\n }\n return context\n}\n\n// ============================================================================\n// Stepper (Root)\n// ============================================================================\n\nfunction StepperRoot({\n currentStep,\n totalSteps,\n orientation = DisplayDirection.VERTICAL,\n completedSteps,\n className,\n children,\n ...props\n}: StepperProps): React.JSX.Element {\n const isCompleted = (step: number) => completedSteps?.has(step) || step < currentStep\n const isCurrent = (step: number) => step === currentStep\n\n return (\n <StepperContext.Provider value={{ currentStep, totalSteps, orientation, isCompleted, isCurrent, completedSteps }}>\n <div\n data-slot=\"stepper\"\n data-orientation={orientation}\n className={cn(\n \"w-full\",\n orientation === DisplayDirection.HORIZONTAL && \"flex items-center justify-between\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </StepperContext.Provider>\n )\n}\n\n// ============================================================================\n// StepperItem\n// ============================================================================\n\nfunction StepperItem({\n step,\n className,\n children,\n ...props\n}: StepperItemProps): React.JSX.Element {\n const { isCompleted, isCurrent, orientation, totalSteps } = useStepperContext()\n const completed = isCompleted(step)\n const current = isCurrent(step)\n\n return (\n <div\n data-slot=\"stepper-item\"\n data-step={step}\n data-state={completed ? \"completed\" : current ? \"current\" : \"pending\"}\n className={cn(\n orientation === DisplayDirection.VERTICAL && \"flex items-start gap-field\",\n orientation === DisplayDirection.HORIZONTAL && \"flex flex-col items-center gap-element\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n}\n\n// ============================================================================\n// StepperIndicator\n// ============================================================================\n\nfunction StepperIndicator({\n step,\n className,\n ...props\n}: StepperIndicatorProps): React.JSX.Element {\n const { isCompleted, isCurrent } = useStepperContext()\n const { renderIcon } = useIconRegistry()\n const completed = isCompleted(step)\n const current = isCurrent(step)\n\n return (\n <div\n data-slot=\"stepper-indicator\"\n data-step={step}\n data-state={completed ? \"completed\" : current ? \"current\" : \"pending\"}\n className={cn(\n \"flex h-8 w-8 shrink-0 items-center justify-center rounded-full border-2 transition-all\",\n completed && \"border-primary bg-primary text-primary-foreground\",\n current && \"border-primary bg-background text-primary\",\n !completed && !current && \"border-muted-foreground/30 bg-background text-muted-foreground\",\n className\n )}\n {...props}\n >\n {completed ? (\n renderIcon(StandardIconReference.CHECK, { size: IconSize.SM })\n ) : (\n // `step` is a 0-based POSITION (the same base as `currentStep`); a person counts from 1.\n <span className=\"text-sm font-semibold\">{step + 1}</span>\n )}\n </div>\n )\n}\n\n// ============================================================================\n// StepperSeparator\n// ============================================================================\n\nfunction StepperSeparator({\n step,\n className,\n ...props\n}: StepperSeparatorProps): React.JSX.Element {\n const { isCompleted, orientation, totalSteps } = useStepperContext()\n const completed = isCompleted(step)\n\n // Don't render a separator after the last step (0-based: the last position is `totalSteps - 1`).\n if (step >= totalSteps - 1) return null\n\n return (\n <div\n data-slot=\"stepper-separator\"\n data-step={step}\n data-state={completed ? \"completed\" : \"pending\"}\n className={cn(\n \"transition-all\",\n orientation === DisplayDirection.VERTICAL && \"w-0.5 h-12 mt-item\",\n orientation === DisplayDirection.HORIZONTAL && \"h-0.5 flex-1 mx-field\",\n completed ? \"bg-primary\" : \"bg-muted-foreground/30\",\n className\n )}\n {...props}\n />\n )\n}\n\n// ============================================================================\n// StepperTitle\n// ============================================================================\n\nfunction StepperTitle({\n step,\n className,\n children,\n ...props\n}: StepperTitleProps): React.JSX.Element {\n const { isCurrent } = useStepperContext()\n const current = isCurrent(step)\n\n return (\n <h4\n data-slot=\"stepper-title\"\n data-step={step}\n data-state={current ? \"current\" : \"inactive\"}\n className={cn(\n \"text-sm font-medium transition-colors\",\n current ? \"text-foreground\" : \"text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </h4>\n )\n}\n\n// ============================================================================\n// StepperDescription\n// ============================================================================\n\nfunction StepperDescription({\n step,\n className,\n children,\n ...props\n}: StepperDescriptionProps): React.JSX.Element {\n const { getRecipe } = useUI()\n const recipe = getRecipe(UIBehavior.TYPOGRAPHY, TypographyVariant.DESCRIPTION)\n\n return (\n <p\n data-slot=\"stepper-description\"\n data-step={step}\n className={cn(\n \"text-xs mt-item-xs\",\n recipe.base,\n className\n )}\n {...props}\n >\n {children}\n </p>\n )\n}\n\nexport const Stepper = createCompoundPreset<StepperCompound>(StepperRoot, { Item: StepperItem, Indicator: StepperIndicator, Separator: StepperSeparator, Title: StepperTitle, Description: StepperDescription })\n\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preset-navigation.d.ts","sourceRoot":"","sources":["../../../../src/config/preset-navigation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"preset-navigation.d.ts","sourceRoot":"","sources":["../../../../src/config/preset-navigation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAM9D;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,EAAE,gBAkBrC,CAAC;AAKF;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,EAAE,gBAoDrC,CAAC;AAKF;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,EAAE,gBAkBtC,CAAC;AAKF;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,EAAE,gBAkBrC,CAAC;AAKF;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,EAAE,gBAkBpC,CAAC;AAKF;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,EAAE,gBAmCzC,CAAC;AAKF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,wBAAwB,EAAE,gBAkBtC,CAAC;AAKF;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,EAAE,gBA2CtC,CAAC"}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* Spatial models that define how content zones relate and how transitions
|
|
5
5
|
* (push, replace, overlay, split) resolve per resource operation.
|
|
6
6
|
*/
|
|
7
|
-
import { CoreResourceOperation, NavigationTransition, NavigationZoneContentModel, } from '@wildo-ai/saas-models';
|
|
8
|
-
import { DisplayDirection } from '@wildo-ai/zod-decorators';
|
|
7
|
+
import { CoreResourceOperation, NavigationTransition, NavigationZoneContentModel, ResponsiveCollapseMode, ZoneEmptyBehavior, } from '@wildo-ai/saas-models';
|
|
8
|
+
import { DisplayDirection, ViewportBreakpoint } from '@wildo-ai/zod-decorators';
|
|
9
9
|
// ─── Stack Layout ─────────────────────────────────────────────────────────────
|
|
10
10
|
/**
|
|
11
11
|
* Single-zone layout — all content lives in one primary zone.
|
|
@@ -64,6 +64,27 @@ export const NAVIGATION_LAYOUT_SPLIT = {
|
|
|
64
64
|
[CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,
|
|
65
65
|
[CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,
|
|
66
66
|
},
|
|
67
|
+
/*
|
|
68
|
+
* ─── The two fields every adjacent zone owes, demonstrated here because THIS is where an
|
|
69
|
+
* application copies a pane from ───────────────────────────────────────────────────────
|
|
70
|
+
*
|
|
71
|
+
* No shipped preset declared either until 2026-09-25, so every one of them fell to the
|
|
72
|
+
* resolver's floors and the catalogue taught neither. A preset is the first and often the only
|
|
73
|
+
* two-zone layout an author reads.
|
|
74
|
+
*
|
|
75
|
+
* `EMPTY_STATE` rather than `COLLAPSE` because a list-and-detail reader steps through rows: the
|
|
76
|
+
* pane keeps its width and shows a placeholder, so the list does not reflow under the cursor on
|
|
77
|
+
* every click. (`COLLAPSE` is right when the pane is occasional — see `NAVIGATION_LAYOUT_COMPANION`.)
|
|
78
|
+
*
|
|
79
|
+
* `responsiveCollapse` is declared even though `PUSH` is the default, because the content areas
|
|
80
|
+
* render ONE zone below the breakpoint: a pane that declared nothing would swallow the drill-in.
|
|
81
|
+
* Saying it is what makes the behaviour readable in the layout rather than in the resolver.
|
|
82
|
+
*/
|
|
83
|
+
onEmpty: ZoneEmptyBehavior.EMPTY_STATE,
|
|
84
|
+
responsiveCollapse: {
|
|
85
|
+
[ViewportBreakpoint.VERT_TABLET]: ResponsiveCollapseMode.PUSH,
|
|
86
|
+
[ViewportBreakpoint.MOBILE]: ResponsiveCollapseMode.PUSH,
|
|
87
|
+
},
|
|
67
88
|
},
|
|
68
89
|
},
|
|
69
90
|
appLevel: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preset-navigation.js","sourceRoot":"","sources":["../../../../src/config/preset-navigation.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Navigation Layout Presets — `NAVIGATION_LAYOUT_*`\n *\n * Spatial models that define how content zones relate and how transitions\n * (push, replace, overlay, split) resolve per resource operation.\n */\n\nimport {\n CoreResourceOperation,\n NavigationTransition,\n NavigationZoneContentModel,\n} from '@wildo-ai/saas-models';\nimport type { NavigationLayout } from '@wildo-ai/saas-models';\nimport { DisplayDirection } from '@wildo-ai/zod-decorators';\n\n\n// ─── Stack Layout ─────────────────────────────────────────────────────────────\n\n/**\n * Single-zone layout — all content lives in one primary zone.\n *\n * - Read → push (drill into a record)\n * - Create/Update → overlay (dialog above the layout)\n * - List → replace (sidebar/breadcrumb back to list)\n *\n * Best for: task managers, SaaS tools, CRMs, project tools.\n */\nexport const NAVIGATION_LAYOUT_STACK: NavigationLayout = {\n zones: {\n primary: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.PUSH,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n },\n },\n },\n appLevel: {\n transitions: {\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n },\n },\n};\n\n\n// ─── Split Layout ────────────────────────────────────────────────────────────\n\n/**\n * Split-panel layout — primary zone for lists, secondary zone for detail.\n *\n * - Read → split (open detail alongside list)\n * - Create → overlay (dialog above the split)\n * - Update → push in secondary zone\n * - List → replace primary\n *\n * Best for: admin panels, email clients, data-heavy dashboards.\n */\nexport const NAVIGATION_LAYOUT_SPLIT: NavigationLayout = {\n zones: {\n primary: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.SPLIT,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n },\n },\n secondary: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.PUSH,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n },\n },\n },\n appLevel: {\n transitions: {\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n },\n },\n split: {\n ratio: [40, 60],\n orientation: DisplayDirection.VERTICAL,\n resizable: false,\n },\n};\n\n\n// ─── Wizard Layout ───────────────────────────────────────────────────────────\n\n/**\n * Step-by-step layout — create/update as full-page PUSH, no overlays.\n *\n * - Read → push\n * - Create/Update → push (full-page steps, wizard flow)\n * - List → replace\n *\n * Best for: form-heavy flows, insurance, onboarding, surveys.\n */\nexport const NAVIGATION_LAYOUT_WIZARD: NavigationLayout = {\n zones: {\n primary: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.PUSH,\n [CoreResourceOperation.CREATE]: NavigationTransition.PUSH,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n },\n },\n },\n appLevel: {\n transitions: {\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n [CoreResourceOperation.CREATE]: NavigationTransition.PUSH,\n },\n },\n};\n\n\n// ─── Paged Layout ────────────────────────────────────────────────────────────\n\n/**\n * Full-page layout — everything as PUSH, no overlays or splits.\n *\n * - Read → push\n * - Create → push\n * - Update → push\n * - List → replace\n *\n * Best for: mobile-first PWAs, content apps, marketing tools.\n */\nexport const NAVIGATION_LAYOUT_PAGED: NavigationLayout = {\n zones: {\n primary: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.PUSH,\n [CoreResourceOperation.CREATE]: NavigationTransition.PUSH,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n },\n },\n },\n appLevel: {\n transitions: {\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n [CoreResourceOperation.CREATE]: NavigationTransition.PUSH,\n },\n },\n};\n\n\n// ─── Tabs Layout ─────────────────────────────────────────────────────────────\n\n/**\n * Tabbed primary zone — read creates new tab, create as overlay.\n *\n * - Read → push (new tab or activate existing)\n * - Create → overlay\n * - Update → push\n * - List → replace\n *\n * Best for: multi-document editors, analytics workbenches, email clients.\n */\nexport const NAVIGATION_LAYOUT_TABS: NavigationLayout = {\n zones: {\n primary: {\n contentModel: NavigationZoneContentModel.TABBED,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.PUSH,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n },\n },\n },\n appLevel: {\n transitions: {\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n },\n },\n};\n\n\n// ─── Companion Layout ───────────────────────────────────────────────────────\n\n/**\n * Primary + companion layout — persistent side panel for chat, threads, docs.\n *\n * - Read → split (persistent, targets companion)\n * - Create → overlay\n * - List → replace\n *\n * Best for: chat apps, knowledge bases, Slack-like thread panels.\n */\nexport const NAVIGATION_LAYOUT_COMPANION: NavigationLayout = {\n zones: {\n primary: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: { transition: NavigationTransition.SPLIT, persistent: true },\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n },\n },\n companion: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.PUSH,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n },\n },\n },\n appLevel: {\n transitions: {\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n },\n },\n split: {\n ratio: [70, 30],\n orientation: DisplayDirection.VERTICAL,\n resizable: false,\n companion: {\n ratio: [70, 30],\n resizable: true,\n },\n },\n};\n\n\n// ─── Inline Layout ──────────────────────────────────────────────────────────\n\n/**\n * Inline layout — create/update as INPLACE within lists.\n *\n * - Read → push\n * - Create/Update → inplace (inline forms within lists)\n * - List → replace\n *\n * `inplace` is hosted by the COLLECTION the element belongs to, so it does what it says only where\n * there is one. An UPDATE reached from a row transforms that row; a CREATE reached from inside a\n * list materialises a new element there. The same CREATE reached from a global affordance that is\n * NOT inside a collection — an app-shell FAB, a command-menu entry — has no collection to\n * materialise into and degrades to an overlay. That is why `appLevel` below carries the same\n * mapping and is not a contradiction: it states the intent, and the framework supplies the nearest\n * honest presentation when the surface cannot honour it.\n *\n * Best for: Kanban, lightweight CRMs, inline editing.\n */\nexport const NAVIGATION_LAYOUT_INLINE: NavigationLayout = {\n zones: {\n primary: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.PUSH,\n [CoreResourceOperation.CREATE]: NavigationTransition.INPLACE,\n [CoreResourceOperation.UPDATE]: NavigationTransition.INPLACE,\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n },\n },\n },\n appLevel: {\n transitions: {\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n [CoreResourceOperation.CREATE]: NavigationTransition.INPLACE,\n },\n },\n};\n\n\n// ─── Triple Layout ───────────────────────────────────────────────────────────\n\n/**\n * Three-column layout — primary + secondary + companion.\n *\n * - Read → split (secondary)\n * - Create → overlay\n * - Companion for persistent supplementary content\n *\n * Best for: email clients, IDE-like tools, ERP.\n */\nexport const NAVIGATION_LAYOUT_TRIPLE: NavigationLayout = {\n zones: {\n primary: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.SPLIT,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n },\n },\n secondary: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: { transition: NavigationTransition.SPLIT, persistent: true },\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n },\n },\n companion: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.PUSH,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n },\n },\n },\n appLevel: {\n transitions: {\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n },\n },\n split: {\n ratio: [30, 45],\n orientation: DisplayDirection.VERTICAL,\n resizable: true,\n companion: {\n ratio: [75, 25],\n resizable: true,\n },\n },\n};\n"]}
|
|
1
|
+
{"version":3,"file":"preset-navigation.js","sourceRoot":"","sources":["../../../../src/config/preset-navigation.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Navigation Layout Presets — `NAVIGATION_LAYOUT_*`\n *\n * Spatial models that define how content zones relate and how transitions\n * (push, replace, overlay, split) resolve per resource operation.\n */\n\nimport {\n CoreResourceOperation,\n NavigationTransition,\n NavigationZoneContentModel,\n ResponsiveCollapseMode,\n ZoneEmptyBehavior,\n} from '@wildo-ai/saas-models';\nimport type { NavigationLayout } from '@wildo-ai/saas-models';\nimport { DisplayDirection, ViewportBreakpoint } from '@wildo-ai/zod-decorators';\n\n\n// ─── Stack Layout ─────────────────────────────────────────────────────────────\n\n/**\n * Single-zone layout — all content lives in one primary zone.\n *\n * - Read → push (drill into a record)\n * - Create/Update → overlay (dialog above the layout)\n * - List → replace (sidebar/breadcrumb back to list)\n *\n * Best for: task managers, SaaS tools, CRMs, project tools.\n */\nexport const NAVIGATION_LAYOUT_STACK: NavigationLayout = {\n zones: {\n primary: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.PUSH,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n },\n },\n },\n appLevel: {\n transitions: {\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n },\n },\n};\n\n\n// ─── Split Layout ────────────────────────────────────────────────────────────\n\n/**\n * Split-panel layout — primary zone for lists, secondary zone for detail.\n *\n * - Read → split (open detail alongside list)\n * - Create → overlay (dialog above the split)\n * - Update → push in secondary zone\n * - List → replace primary\n *\n * Best for: admin panels, email clients, data-heavy dashboards.\n */\nexport const NAVIGATION_LAYOUT_SPLIT: NavigationLayout = {\n zones: {\n primary: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.SPLIT,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n },\n },\n secondary: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.PUSH,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n },\n /*\n * ─── The two fields every adjacent zone owes, demonstrated here because THIS is where an\n * application copies a pane from ───────────────────────────────────────────────────────\n *\n * No shipped preset declared either until 2026-09-25, so every one of them fell to the\n * resolver's floors and the catalogue taught neither. A preset is the first and often the only\n * two-zone layout an author reads.\n *\n * `EMPTY_STATE` rather than `COLLAPSE` because a list-and-detail reader steps through rows: the\n * pane keeps its width and shows a placeholder, so the list does not reflow under the cursor on\n * every click. (`COLLAPSE` is right when the pane is occasional — see `NAVIGATION_LAYOUT_COMPANION`.)\n *\n * `responsiveCollapse` is declared even though `PUSH` is the default, because the content areas\n * render ONE zone below the breakpoint: a pane that declared nothing would swallow the drill-in.\n * Saying it is what makes the behaviour readable in the layout rather than in the resolver.\n */\n onEmpty: ZoneEmptyBehavior.EMPTY_STATE,\n responsiveCollapse: {\n [ViewportBreakpoint.VERT_TABLET]: ResponsiveCollapseMode.PUSH,\n [ViewportBreakpoint.MOBILE]: ResponsiveCollapseMode.PUSH,\n },\n },\n },\n appLevel: {\n transitions: {\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n },\n },\n split: {\n ratio: [40, 60],\n orientation: DisplayDirection.VERTICAL,\n resizable: false,\n },\n};\n\n\n// ─── Wizard Layout ───────────────────────────────────────────────────────────\n\n/**\n * Step-by-step layout — create/update as full-page PUSH, no overlays.\n *\n * - Read → push\n * - Create/Update → push (full-page steps, wizard flow)\n * - List → replace\n *\n * Best for: form-heavy flows, insurance, onboarding, surveys.\n */\nexport const NAVIGATION_LAYOUT_WIZARD: NavigationLayout = {\n zones: {\n primary: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.PUSH,\n [CoreResourceOperation.CREATE]: NavigationTransition.PUSH,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n },\n },\n },\n appLevel: {\n transitions: {\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n [CoreResourceOperation.CREATE]: NavigationTransition.PUSH,\n },\n },\n};\n\n\n// ─── Paged Layout ────────────────────────────────────────────────────────────\n\n/**\n * Full-page layout — everything as PUSH, no overlays or splits.\n *\n * - Read → push\n * - Create → push\n * - Update → push\n * - List → replace\n *\n * Best for: mobile-first PWAs, content apps, marketing tools.\n */\nexport const NAVIGATION_LAYOUT_PAGED: NavigationLayout = {\n zones: {\n primary: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.PUSH,\n [CoreResourceOperation.CREATE]: NavigationTransition.PUSH,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n },\n },\n },\n appLevel: {\n transitions: {\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n [CoreResourceOperation.CREATE]: NavigationTransition.PUSH,\n },\n },\n};\n\n\n// ─── Tabs Layout ─────────────────────────────────────────────────────────────\n\n/**\n * Tabbed primary zone — read creates new tab, create as overlay.\n *\n * - Read → push (new tab or activate existing)\n * - Create → overlay\n * - Update → push\n * - List → replace\n *\n * Best for: multi-document editors, analytics workbenches, email clients.\n */\nexport const NAVIGATION_LAYOUT_TABS: NavigationLayout = {\n zones: {\n primary: {\n contentModel: NavigationZoneContentModel.TABBED,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.PUSH,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n },\n },\n },\n appLevel: {\n transitions: {\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n },\n },\n};\n\n\n// ─── Companion Layout ───────────────────────────────────────────────────────\n\n/**\n * Primary + companion layout — persistent side panel for chat, threads, docs.\n *\n * - Read → split (persistent, targets companion)\n * - Create → overlay\n * - List → replace\n *\n * Best for: chat apps, knowledge bases, Slack-like thread panels.\n */\nexport const NAVIGATION_LAYOUT_COMPANION: NavigationLayout = {\n zones: {\n primary: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: { transition: NavigationTransition.SPLIT, persistent: true },\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n },\n },\n companion: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.PUSH,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n },\n },\n },\n appLevel: {\n transitions: {\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n },\n },\n split: {\n ratio: [70, 30],\n orientation: DisplayDirection.VERTICAL,\n resizable: false,\n companion: {\n ratio: [70, 30],\n resizable: true,\n },\n },\n};\n\n\n// ─── Inline Layout ──────────────────────────────────────────────────────────\n\n/**\n * Inline layout — create/update as INPLACE within lists.\n *\n * - Read → push\n * - Create/Update → inplace (inline forms within lists)\n * - List → replace\n *\n * `inplace` is hosted by the COLLECTION the element belongs to, so it does what it says only where\n * there is one. An UPDATE reached from a row transforms that row; a CREATE reached from inside a\n * list materialises a new element there. The same CREATE reached from a global affordance that is\n * NOT inside a collection — an app-shell FAB, a command-menu entry — has no collection to\n * materialise into and degrades to an overlay. That is why `appLevel` below carries the same\n * mapping and is not a contradiction: it states the intent, and the framework supplies the nearest\n * honest presentation when the surface cannot honour it.\n *\n * Best for: Kanban, lightweight CRMs, inline editing.\n */\nexport const NAVIGATION_LAYOUT_INLINE: NavigationLayout = {\n zones: {\n primary: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.PUSH,\n [CoreResourceOperation.CREATE]: NavigationTransition.INPLACE,\n [CoreResourceOperation.UPDATE]: NavigationTransition.INPLACE,\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n },\n },\n },\n appLevel: {\n transitions: {\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n [CoreResourceOperation.CREATE]: NavigationTransition.INPLACE,\n },\n },\n};\n\n\n// ─── Triple Layout ───────────────────────────────────────────────────────────\n\n/**\n * Three-column layout — primary + secondary + companion.\n *\n * - Read → split (secondary)\n * - Create → overlay\n * - Companion for persistent supplementary content\n *\n * Best for: email clients, IDE-like tools, ERP.\n */\nexport const NAVIGATION_LAYOUT_TRIPLE: NavigationLayout = {\n zones: {\n primary: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.SPLIT,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n },\n },\n secondary: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: { transition: NavigationTransition.SPLIT, persistent: true },\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n },\n },\n companion: {\n contentModel: NavigationZoneContentModel.SINGLE,\n transitions: {\n [CoreResourceOperation.READ]: NavigationTransition.PUSH,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n [CoreResourceOperation.UPDATE]: NavigationTransition.PUSH,\n },\n },\n },\n appLevel: {\n transitions: {\n [CoreResourceOperation.LIST]: NavigationTransition.REPLACE,\n [CoreResourceOperation.CREATE]: NavigationTransition.OVERLAY,\n },\n },\n split: {\n ratio: [30, 45],\n orientation: DisplayDirection.VERTICAL,\n resizable: true,\n companion: {\n ratio: [75, 25],\n resizable: true,\n },\n },\n};\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ResourceUIBehavior } from '@wildo-ai/saas-frontend-lib';
|
|
2
|
+
export declare function buildAgentWorkMainPresets(): Partial<ResourceUIBehavior>;
|
|
3
|
+
export declare const agentWorkMainPresets: Partial<ResourceUIBehavior>;
|
|
4
|
+
//# sourceMappingURL=agent-work.resource-presets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-work.resource-presets.d.ts","sourceRoot":"","sources":["../../../../../src/config/resources/agent-work.resource-presets.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAsFtE,wBAAgB,yBAAyB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAqFvE;AAED,eAAO,MAAM,oBAAoB,6BAA8B,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { LabellingTypes } from '@wildo-ai/presets-components-models';
|
|
3
|
+
import { CollectionDisplayMode, DisplayField, DisplayLayout, SummaryLayout, SummaryMeta, resourceUIBehavior } from '@wildo-ai/saas-frontend-lib';
|
|
4
|
+
import { BadgeSemanticVariant, DisplayChromeMode, EditChromeMode, EnumDisplayMode, StringDisplayMode, StringEditMode } from '@wildo-ai/zod-decorators';
|
|
5
|
+
import { DatabaseZap, FileCheck2, ScanEye } from 'lucide-react';
|
|
6
|
+
import { AgentWorkCaptureSettingsSchema, CoreResourceOperation as Op, CoreResourceType as R, CorrectionContentCapture, EvaluationDatasetExportSchema, EvaluationExportAuthorizationSchema, EvaluationExportAuthorizationStatus, agentWorkCaptureSettingsResourceConfiguration_InitializationFactory as captureSettingsFactory, evaluationDatasetExportsResourceConfiguration_InitializationFactory as datasetExportsFactory, evaluationExportAuthorizationsResourceConfiguration_InitializationFactory as exportAuthorizationsFactory, } from '@wildo-ai/saas-models';
|
|
7
|
+
import { addressable, notAddressable } from './resource.config.utils.js';
|
|
8
|
+
const CHROME = {
|
|
9
|
+
display: DisplayChromeMode.SETTINGS_ROW,
|
|
10
|
+
summary: DisplayChromeMode.HIDDEN,
|
|
11
|
+
edit: EditChromeMode.SETTINGS_ROW,
|
|
12
|
+
};
|
|
13
|
+
const hideWhenEmpty = { display: { hideWhenEmpty: true } };
|
|
14
|
+
/** What the organization keeps, why, who else may read it, and for which cases. */
|
|
15
|
+
function CaptureSettingsDisplayTemplate() {
|
|
16
|
+
return (_jsxs(DisplayLayout, { children: [_jsx(DisplayField, { name: "contentCapture" }), _jsx(DisplayField, { name: "purpose" }), _jsx(DisplayField, { name: "contentReaderRole" }), _jsx(DisplayField, { name: "narrowToCaseRefs" }), _jsx(DisplayField, { name: "updatedAt" })] }));
|
|
17
|
+
}
|
|
18
|
+
/** Whether exports are authorised, on which basis and where it is documented, then the per-case consents and walls. */
|
|
19
|
+
function ExportAuthorizationDisplayTemplate() {
|
|
20
|
+
return (_jsxs(DisplayLayout, { children: [_jsx(DisplayField, { name: "status" }), _jsx(DisplayField, { name: "basis" }), _jsx(DisplayField, { name: "basisReference" }), _jsx(DisplayField, { name: "clientConsents" }), _jsx(DisplayField, { name: "excludedCaseRefs" }), _jsx(DisplayField, { name: "updatedAt" })] }));
|
|
21
|
+
}
|
|
22
|
+
/** One export: when, of which agent, how many records, where it went, under which basis, and whether it still stands. */
|
|
23
|
+
function DatasetExportDisplayTemplate() {
|
|
24
|
+
return (_jsxs(DisplayLayout, { children: [_jsx(DisplayField, { name: "exportedAt" }), _jsx(DisplayField, { name: "agentRef" }), _jsx(DisplayField, { name: "recordCount" }), _jsx(DisplayField, { name: "windowFrom" }), _jsx(DisplayField, { name: "windowTo" }), _jsx(DisplayField, { name: "destination" }), _jsx(DisplayField, { name: "basis" }), _jsx(DisplayField, { name: "exportedByUserId" }), _jsx(DisplayField, { name: "invalidationReason" }), _jsx(DisplayField, { name: "invalidatedAt" }), _jsx(DisplayField, { name: "pseudonymisationVersion" })] }));
|
|
25
|
+
}
|
|
26
|
+
/* A ledger row: the agent is its title; when, how many and whether it was invalidated beside it. */
|
|
27
|
+
function DatasetExportSummaryTemplate() {
|
|
28
|
+
return (_jsx(SummaryLayout, { children: _jsxs(SummaryMeta, { children: [_jsx(DisplayField, { name: "exportedAt" }), _jsx(DisplayField, { name: "recordCount" }), _jsx(DisplayField, { name: "invalidationReason" })] }) }));
|
|
29
|
+
}
|
|
30
|
+
export function buildAgentWorkMainPresets() {
|
|
31
|
+
return {
|
|
32
|
+
[R.AGENT_WORK_CAPTURE_SETTINGS]: resourceUIBehavior(captureSettingsFactory, AgentWorkCaptureSettingsSchema, ({ schemaShape }) => ({
|
|
33
|
+
icon: ScanEye,
|
|
34
|
+
// One row per organization and no name of its own: it is named by its resource's words.
|
|
35
|
+
getFrontendResourceLabel: ({ t, resourceType }) => t(`${LabellingTypes.RESOURCES}.${resourceType}.operations.read.title`),
|
|
36
|
+
layout: {
|
|
37
|
+
defaultChromeMode: CHROME,
|
|
38
|
+
defaultEmptyValue: 'placeholder',
|
|
39
|
+
display: CaptureSettingsDisplayTemplate,
|
|
40
|
+
},
|
|
41
|
+
fields: {
|
|
42
|
+
contentCapture: schemaShape.contentCapture.enumUI({
|
|
43
|
+
display: { displayMode: EnumDisplayMode.BADGE, showDescription: true },
|
|
44
|
+
values: {
|
|
45
|
+
[CorrectionContentCapture.METADATA_ONLY]: { color: BadgeSemanticVariant.SECONDARY },
|
|
46
|
+
[CorrectionContentCapture.WITH_CONTENT]: { color: BadgeSemanticVariant.WARNING },
|
|
47
|
+
},
|
|
48
|
+
}),
|
|
49
|
+
// Shown with its description on the form: the purpose is what makes keeping client material lawful here.
|
|
50
|
+
purpose: schemaShape.purpose.stringUI({ edit: { showDescription: true } }),
|
|
51
|
+
// #1921 — the ONE organization role, besides the administrator, that may read kept content: PICKED from the
|
|
52
|
+
// organization's role table (core + custom roles) and shown as the role's word, never typed as a key. A typed key
|
|
53
|
+
// with a typo named a role nobody holds, which admitted nobody and said nothing.
|
|
54
|
+
contentReaderRole: schemaShape.contentReaderRole.stringUI({
|
|
55
|
+
display: { displayMode: StringDisplayMode.ORGANIZATION_ROLE },
|
|
56
|
+
edit: { editMode: StringEditMode.ORGANIZATION_ROLE, showDescription: true },
|
|
57
|
+
}),
|
|
58
|
+
},
|
|
59
|
+
// The page is the READ (created METADATA_ONLY on first access); the change is one audited act in the form.
|
|
60
|
+
views: [
|
|
61
|
+
[Op.READ, addressable()],
|
|
62
|
+
[Op.UPDATE, notAddressable()],
|
|
63
|
+
],
|
|
64
|
+
})),
|
|
65
|
+
[R.EVALUATION_EXPORT_AUTHORIZATIONS]: resourceUIBehavior(exportAuthorizationsFactory, EvaluationExportAuthorizationSchema, ({ schemaShape }) => ({
|
|
66
|
+
icon: FileCheck2,
|
|
67
|
+
getFrontendResourceLabel: ({ t, resourceType }) => t(`${LabellingTypes.RESOURCES}.${resourceType}.operations.read.title`),
|
|
68
|
+
layout: {
|
|
69
|
+
defaultChromeMode: CHROME,
|
|
70
|
+
defaultEmptyValue: 'placeholder',
|
|
71
|
+
display: ExportAuthorizationDisplayTemplate,
|
|
72
|
+
},
|
|
73
|
+
fields: {
|
|
74
|
+
status: schemaShape.status.enumUI({
|
|
75
|
+
display: { displayMode: EnumDisplayMode.BADGE, showDescription: true },
|
|
76
|
+
values: {
|
|
77
|
+
[EvaluationExportAuthorizationStatus.NOT_GRANTED]: { color: BadgeSemanticVariant.SECONDARY },
|
|
78
|
+
[EvaluationExportAuthorizationStatus.ACTIVE]: { color: BadgeSemanticVariant.SUCCESS },
|
|
79
|
+
[EvaluationExportAuthorizationStatus.REVOKED]: { color: BadgeSemanticVariant.DESTRUCTIVE },
|
|
80
|
+
},
|
|
81
|
+
}),
|
|
82
|
+
basis: schemaShape.basis.enumUI({ edit: { showDescription: true } }),
|
|
83
|
+
basisReference: schemaShape.basisReference.stringUI({ edit: { showDescription: true } }),
|
|
84
|
+
},
|
|
85
|
+
// The page is the READ (created NOT_GRANTED on first access); granting, changing and revoking are the form.
|
|
86
|
+
views: [
|
|
87
|
+
[Op.READ, addressable()],
|
|
88
|
+
[Op.UPDATE, notAddressable()],
|
|
89
|
+
],
|
|
90
|
+
})),
|
|
91
|
+
// Every dataset the organization exported, newest first; a dataset a withdrawn basis or an erasure invalidated says so.
|
|
92
|
+
[R.EVALUATION_DATASET_EXPORTS]: resourceUIBehavior(datasetExportsFactory, EvaluationDatasetExportSchema, ({ schemaShape }) => ({
|
|
93
|
+
icon: DatabaseZap,
|
|
94
|
+
getFrontendResourceLabel: ({ currentObject }) => currentObject.agentRef || currentObject._id,
|
|
95
|
+
layout: {
|
|
96
|
+
defaultChromeMode: CHROME,
|
|
97
|
+
display: DatasetExportDisplayTemplate,
|
|
98
|
+
summary: DatasetExportSummaryTemplate,
|
|
99
|
+
},
|
|
100
|
+
fields: {
|
|
101
|
+
invalidationReason: schemaShape.invalidationReason.enumUI({
|
|
102
|
+
display: { displayMode: EnumDisplayMode.BADGE, hideWhenEmpty: true },
|
|
103
|
+
}),
|
|
104
|
+
invalidatedAt: schemaShape.invalidatedAt.dateUI(hideWhenEmpty),
|
|
105
|
+
exportedByUserId: schemaShape.exportedByUserId.stringUI(hideWhenEmpty),
|
|
106
|
+
},
|
|
107
|
+
views: [
|
|
108
|
+
[Op.LIST, addressable({ collectionDisplayConfig: { displayMode: CollectionDisplayMode.TABLE, userSwitchableDisplayMode: true } })],
|
|
109
|
+
[Op.READ, notAddressable()],
|
|
110
|
+
],
|
|
111
|
+
})),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
export const agentWorkMainPresets = buildAgentWorkMainPresets();
|
|
115
|
+
//# sourceMappingURL=agent-work.resource-presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-work.resource-presets.js","sourceRoot":"","sources":["../../../../../src/config/resources/agent-work.resource-presets.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Experts' corrections to agent work (#1599): the organization's own settings pages for them.\n *\n * - The content-capture setting and the evaluation-export authorisation are SINGLETONS of the organization: each page\n * IS the resource's READ, which the backend creates in its default state on first access (METADATA_ONLY /\n * NOT_GRANTED), and the change is the UPDATE form. Each is one audited decision, so it is taken as one act in the\n * form rather than field by field in place: turning content capture on needs its purpose in the same write, and a\n * grant needs its basis and the reference to where it is documented.\n * - The export ledger is the list of every dataset the organization exported, read in its settings beside the\n * authorisation it relied on.\n *\n * Surfaced by the `agent-work-review` Settings Hub destination (organization administrators), beside the\n * override-rate panel.\n */\nimport React from 'react';\nimport type { ResourceUIBehavior } from '@wildo-ai/saas-frontend-lib';\nimport { LabellingTypes } from '@wildo-ai/presets-components-models';\nimport { CollectionDisplayMode, DisplayField, DisplayLayout, SummaryLayout, SummaryMeta, resourceUIBehavior } from '@wildo-ai/saas-frontend-lib';\nimport { BadgeSemanticVariant, DisplayChromeMode, EditChromeMode, EnumDisplayMode, StringDisplayMode, StringEditMode } from '@wildo-ai/zod-decorators';\nimport { DatabaseZap, FileCheck2, ScanEye } from 'lucide-react';\nimport {\n AgentWorkCaptureSettingsSchema,\n CoreResourceOperation as Op,\n CoreResourceType as R,\n CorrectionContentCapture,\n EvaluationDatasetExportSchema,\n EvaluationExportAuthorizationSchema,\n EvaluationExportAuthorizationStatus,\n agentWorkCaptureSettingsResourceConfiguration_InitializationFactory as captureSettingsFactory,\n evaluationDatasetExportsResourceConfiguration_InitializationFactory as datasetExportsFactory,\n evaluationExportAuthorizationsResourceConfiguration_InitializationFactory as exportAuthorizationsFactory,\n} from '@wildo-ai/saas-models';\nimport { addressable, notAddressable } from './resource.config.utils';\n\nconst CHROME = {\n display: DisplayChromeMode.SETTINGS_ROW,\n summary: DisplayChromeMode.HIDDEN,\n edit: EditChromeMode.SETTINGS_ROW,\n} as const;\n\nconst hideWhenEmpty = { display: { hideWhenEmpty: true } } as const;\n\n/** What the organization keeps, why, who else may read it, and for which cases. */\nfunction CaptureSettingsDisplayTemplate(): React.JSX.Element {\n return (\n <DisplayLayout>\n <DisplayField name=\"contentCapture\" />\n <DisplayField name=\"purpose\" />\n <DisplayField name=\"contentReaderRole\" />\n <DisplayField name=\"narrowToCaseRefs\" />\n <DisplayField name=\"updatedAt\" />\n </DisplayLayout>\n );\n}\n\n/** Whether exports are authorised, on which basis and where it is documented, then the per-case consents and walls. */\nfunction ExportAuthorizationDisplayTemplate(): React.JSX.Element {\n return (\n <DisplayLayout>\n <DisplayField name=\"status\" />\n <DisplayField name=\"basis\" />\n <DisplayField name=\"basisReference\" />\n <DisplayField name=\"clientConsents\" />\n <DisplayField name=\"excludedCaseRefs\" />\n <DisplayField name=\"updatedAt\" />\n </DisplayLayout>\n );\n}\n\n/** One export: when, of which agent, how many records, where it went, under which basis, and whether it still stands. */\nfunction DatasetExportDisplayTemplate(): React.JSX.Element {\n return (\n <DisplayLayout>\n <DisplayField name=\"exportedAt\" />\n <DisplayField name=\"agentRef\" />\n <DisplayField name=\"recordCount\" />\n <DisplayField name=\"windowFrom\" />\n <DisplayField name=\"windowTo\" />\n <DisplayField name=\"destination\" />\n <DisplayField name=\"basis\" />\n <DisplayField name=\"exportedByUserId\" />\n <DisplayField name=\"invalidationReason\" />\n <DisplayField name=\"invalidatedAt\" />\n <DisplayField name=\"pseudonymisationVersion\" />\n </DisplayLayout>\n );\n}\n\n/* A ledger row: the agent is its title; when, how many and whether it was invalidated beside it. */\nfunction DatasetExportSummaryTemplate(): React.JSX.Element {\n return (\n <SummaryLayout>\n <SummaryMeta>\n <DisplayField name=\"exportedAt\" />\n <DisplayField name=\"recordCount\" />\n <DisplayField name=\"invalidationReason\" />\n </SummaryMeta>\n </SummaryLayout>\n );\n}\n\nexport function buildAgentWorkMainPresets(): Partial<ResourceUIBehavior> {\n return {\n [R.AGENT_WORK_CAPTURE_SETTINGS]: resourceUIBehavior(captureSettingsFactory, AgentWorkCaptureSettingsSchema, ({ schemaShape }) => ({\n icon: ScanEye,\n // One row per organization and no name of its own: it is named by its resource's words.\n getFrontendResourceLabel: ({ t, resourceType }) => t(`${LabellingTypes.RESOURCES}.${resourceType}.operations.read.title`),\n layout: {\n defaultChromeMode: CHROME,\n defaultEmptyValue: 'placeholder',\n display: CaptureSettingsDisplayTemplate,\n },\n fields: {\n contentCapture: schemaShape.contentCapture.enumUI({\n display: { displayMode: EnumDisplayMode.BADGE, showDescription: true },\n values: {\n [CorrectionContentCapture.METADATA_ONLY]: { color: BadgeSemanticVariant.SECONDARY },\n [CorrectionContentCapture.WITH_CONTENT]: { color: BadgeSemanticVariant.WARNING },\n },\n }),\n // Shown with its description on the form: the purpose is what makes keeping client material lawful here.\n purpose: schemaShape.purpose.stringUI({ edit: { showDescription: true } }),\n // #1921 — the ONE organization role, besides the administrator, that may read kept content: PICKED from the\n // organization's role table (core + custom roles) and shown as the role's word, never typed as a key. A typed key\n // with a typo named a role nobody holds, which admitted nobody and said nothing.\n contentReaderRole: schemaShape.contentReaderRole.stringUI({\n display: { displayMode: StringDisplayMode.ORGANIZATION_ROLE },\n edit: { editMode: StringEditMode.ORGANIZATION_ROLE, showDescription: true },\n }),\n },\n // The page is the READ (created METADATA_ONLY on first access); the change is one audited act in the form.\n views: [\n [Op.READ, addressable()],\n [Op.UPDATE, notAddressable()],\n ],\n })),\n\n [R.EVALUATION_EXPORT_AUTHORIZATIONS]: resourceUIBehavior(exportAuthorizationsFactory, EvaluationExportAuthorizationSchema, ({ schemaShape }) => ({\n icon: FileCheck2,\n getFrontendResourceLabel: ({ t, resourceType }) => t(`${LabellingTypes.RESOURCES}.${resourceType}.operations.read.title`),\n layout: {\n defaultChromeMode: CHROME,\n defaultEmptyValue: 'placeholder',\n display: ExportAuthorizationDisplayTemplate,\n },\n fields: {\n status: schemaShape.status.enumUI({\n display: { displayMode: EnumDisplayMode.BADGE, showDescription: true },\n values: {\n [EvaluationExportAuthorizationStatus.NOT_GRANTED]: { color: BadgeSemanticVariant.SECONDARY },\n [EvaluationExportAuthorizationStatus.ACTIVE]: { color: BadgeSemanticVariant.SUCCESS },\n [EvaluationExportAuthorizationStatus.REVOKED]: { color: BadgeSemanticVariant.DESTRUCTIVE },\n },\n }),\n basis: schemaShape.basis.enumUI({ edit: { showDescription: true } }),\n basisReference: schemaShape.basisReference.stringUI({ edit: { showDescription: true } }),\n },\n // The page is the READ (created NOT_GRANTED on first access); granting, changing and revoking are the form.\n views: [\n [Op.READ, addressable()],\n [Op.UPDATE, notAddressable()],\n ],\n })),\n\n // Every dataset the organization exported, newest first; a dataset a withdrawn basis or an erasure invalidated says so.\n [R.EVALUATION_DATASET_EXPORTS]: resourceUIBehavior(datasetExportsFactory, EvaluationDatasetExportSchema, ({ schemaShape }) => ({\n icon: DatabaseZap,\n getFrontendResourceLabel: ({ currentObject }) => currentObject.agentRef || currentObject._id,\n layout: {\n defaultChromeMode: CHROME,\n display: DatasetExportDisplayTemplate,\n summary: DatasetExportSummaryTemplate,\n },\n fields: {\n invalidationReason: schemaShape.invalidationReason.enumUI({\n display: { displayMode: EnumDisplayMode.BADGE, hideWhenEmpty: true },\n }),\n invalidatedAt: schemaShape.invalidatedAt.dateUI(hideWhenEmpty),\n exportedByUserId: schemaShape.exportedByUserId.stringUI(hideWhenEmpty),\n },\n views: [\n [Op.LIST, addressable({ collectionDisplayConfig: { displayMode: CollectionDisplayMode.TABLE, userSwitchableDisplayMode: true } })],\n [Op.READ, notAddressable()],\n ],\n })),\n };\n}\n\nexport const agentWorkMainPresets = buildAgentWorkMainPresets();\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* The rows of an API key's read page that answer "does the key's previous secret still work, and until when?" —
|
|
4
|
+
* shown only while it does.
|
|
5
|
+
*
|
|
6
|
+
* The raw fields mislead in both directions, which is why this component decides and the rows do not:
|
|
7
|
+
* - after a REGENERATE the end date is empty and the old secret works with no end date, so rows that merely hide
|
|
8
|
+
* when empty would show nothing at the moment an operator most needs to see it;
|
|
9
|
+
* - after a default ROTATE the end date is the rotation instant and the old secret is already dead, yet its prefix
|
|
10
|
+
* is still stored, so an unconditional prefix row would show a dead secret as though it mattered.
|
|
11
|
+
*
|
|
12
|
+
* So the pair renders exactly when the request-auth handlers would accept the previous secret
|
|
13
|
+
* (`isPreviousCredentialSecretAccepted`, the same rule they apply). The prefix row's description says what an
|
|
14
|
+
* absent end date means: its words are generated from the `whyItMatters` both API-key specifications declare on
|
|
15
|
+
* `previousKeyPrefix` (the labeller reads the specification, never the schema's `.describe()`). The end-date row
|
|
16
|
+
* hides itself when there is no date.
|
|
17
|
+
*
|
|
18
|
+
* The rule reads the clock when the page renders, so a handover deadline passing while the page is open takes
|
|
19
|
+
* effect on the next render — the same instant-by-instant answer the backend gives each request.
|
|
20
|
+
*/
|
|
21
|
+
export declare function ApiKeyRotationWindowRows(): React.JSX.Element | null;
|
|
22
|
+
//# sourceMappingURL=api-key-rotation-window.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-key-rotation-window.d.ts","sourceRoot":"","sources":["../../../../../src/config/resources/api-key-rotation-window.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAoB1B;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAgBnE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { DisplayField, useDisplayTemplateContext } from '@wildo-ai/saas-frontend-lib';
|
|
3
|
+
import { ApiKeyStatus, isPreviousCredentialSecretAccepted } from '@wildo-ai/saas-models';
|
|
4
|
+
function toDate(value) {
|
|
5
|
+
// Empty stays empty — it is the open-ended window, not a date. (Returned as literals: this package does not
|
|
6
|
+
// narrow on a null test.)
|
|
7
|
+
if (value === null)
|
|
8
|
+
return null;
|
|
9
|
+
if (value === undefined)
|
|
10
|
+
return undefined;
|
|
11
|
+
return new Date(value);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The rows of an API key's read page that answer "does the key's previous secret still work, and until when?" —
|
|
15
|
+
* shown only while it does.
|
|
16
|
+
*
|
|
17
|
+
* The raw fields mislead in both directions, which is why this component decides and the rows do not:
|
|
18
|
+
* - after a REGENERATE the end date is empty and the old secret works with no end date, so rows that merely hide
|
|
19
|
+
* when empty would show nothing at the moment an operator most needs to see it;
|
|
20
|
+
* - after a default ROTATE the end date is the rotation instant and the old secret is already dead, yet its prefix
|
|
21
|
+
* is still stored, so an unconditional prefix row would show a dead secret as though it mattered.
|
|
22
|
+
*
|
|
23
|
+
* So the pair renders exactly when the request-auth handlers would accept the previous secret
|
|
24
|
+
* (`isPreviousCredentialSecretAccepted`, the same rule they apply). The prefix row's description says what an
|
|
25
|
+
* absent end date means: its words are generated from the `whyItMatters` both API-key specifications declare on
|
|
26
|
+
* `previousKeyPrefix` (the labeller reads the specification, never the schema's `.describe()`). The end-date row
|
|
27
|
+
* hides itself when there is no date.
|
|
28
|
+
*
|
|
29
|
+
* The rule reads the clock when the page renders, so a handover deadline passing while the page is open takes
|
|
30
|
+
* effect on the next render — the same instant-by-instant answer the backend gives each request.
|
|
31
|
+
*/
|
|
32
|
+
export function ApiKeyRotationWindowRows() {
|
|
33
|
+
const { data } = useDisplayTemplateContext();
|
|
34
|
+
const key = (data ?? {});
|
|
35
|
+
const accepted = isPreviousCredentialSecretAccepted({
|
|
36
|
+
hasPreviousSecret: Boolean(key.previousKeyPrefix),
|
|
37
|
+
previousSecretInvalidationDate: toDate(key.previousKeyInvalidationDate),
|
|
38
|
+
isActive: key.status === ApiKeyStatus.ACTIVE,
|
|
39
|
+
expiresAt: toDate(key.expiresAt),
|
|
40
|
+
});
|
|
41
|
+
if (!accepted)
|
|
42
|
+
return null;
|
|
43
|
+
return (_jsxs(_Fragment, { children: [_jsx(DisplayField, { name: "previousKeyPrefix" }), _jsx(DisplayField, { name: "previousKeyInvalidationDate" })] }));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=api-key-rotation-window.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-key-rotation-window.js","sourceRoot":"","sources":["../../../../../src/config/resources/api-key-rotation-window.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,kCAAkC,EAAE,MAAM,uBAAuB,CAAC;AAUzF,SAAS,MAAM,CAAC,KAAuC;IACrD,4GAA4G;IAC5G,0BAA0B;IAC1B,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,wBAAwB;IACtC,MAAM,EAAE,IAAI,EAAE,GAAG,yBAAyB,EAAE,CAAC;IAC7C,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAwB,CAAC;IAChD,MAAM,QAAQ,GAAG,kCAAkC,CAAC;QAClD,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACjD,8BAA8B,EAAE,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC;QACvE,QAAQ,EAAE,GAAG,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM;QAC5C,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;KACjC,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,OAAO,CACL,8BACE,KAAC,YAAY,IAAC,IAAI,EAAC,mBAAmB,GAAG,EACzC,KAAC,YAAY,IAAC,IAAI,EAAC,6BAA6B,GAAG,IAClD,CACJ,CAAC;AACJ,CAAC","sourcesContent":["import React from 'react';\nimport { DisplayField, useDisplayTemplateContext } from '@wildo-ai/saas-frontend-lib';\nimport { ApiKeyStatus, isPreviousCredentialSecretAccepted } from '@wildo-ai/saas-models';\n\n/** The fields of an API key that decide whether its previous secret still authenticates. */\ninterface ApiKeyRotationState {\n status?: ApiKeyStatus;\n expiresAt?: Date | string | null;\n previousKeyPrefix?: string | null;\n previousKeyInvalidationDate?: Date | string | null;\n}\n\nfunction toDate(value: Date | string | null | undefined): Date | null | undefined {\n // Empty stays empty — it is the open-ended window, not a date. (Returned as literals: this package does not\n // narrow on a null test.)\n if (value === null) return null;\n if (value === undefined) return undefined;\n return new Date(value);\n}\n\n/**\n * The rows of an API key's read page that answer \"does the key's previous secret still work, and until when?\" —\n * shown only while it does.\n *\n * The raw fields mislead in both directions, which is why this component decides and the rows do not:\n * - after a REGENERATE the end date is empty and the old secret works with no end date, so rows that merely hide\n * when empty would show nothing at the moment an operator most needs to see it;\n * - after a default ROTATE the end date is the rotation instant and the old secret is already dead, yet its prefix\n * is still stored, so an unconditional prefix row would show a dead secret as though it mattered.\n *\n * So the pair renders exactly when the request-auth handlers would accept the previous secret\n * (`isPreviousCredentialSecretAccepted`, the same rule they apply). The prefix row's description says what an\n * absent end date means: its words are generated from the `whyItMatters` both API-key specifications declare on\n * `previousKeyPrefix` (the labeller reads the specification, never the schema's `.describe()`). The end-date row\n * hides itself when there is no date.\n *\n * The rule reads the clock when the page renders, so a handover deadline passing while the page is open takes\n * effect on the next render — the same instant-by-instant answer the backend gives each request.\n */\nexport function ApiKeyRotationWindowRows(): React.JSX.Element | null {\n const { data } = useDisplayTemplateContext();\n const key = (data ?? {}) as ApiKeyRotationState;\n const accepted = isPreviousCredentialSecretAccepted({\n hasPreviousSecret: Boolean(key.previousKeyPrefix),\n previousSecretInvalidationDate: toDate(key.previousKeyInvalidationDate),\n isActive: key.status === ApiKeyStatus.ACTIVE,\n expiresAt: toDate(key.expiresAt),\n });\n if (!accepted) return null;\n return (\n <>\n <DisplayField name=\"previousKeyPrefix\" />\n <DisplayField name=\"previousKeyInvalidationDate\" />\n </>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.resource-presets.d.ts","sourceRoot":"","sources":["../../../../../src/config/resources/application.resource-presets.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"application.resource-presets.d.ts","sourceRoot":"","sources":["../../../../../src/config/resources/application.resource-presets.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AA+EtE;;;;;;;;;;GAUG;AAEH,wBAAgB,2BAA2B,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAmDzE;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0kB3G;AAED,eAAO,MAAM,sBAAsB,6BAAgC,CAAC;AACpE,eAAO,MAAM,uBAAuB,6BAAuD,CAAC;AAE5F,eAAO,MAAM,4CAA4C,gGAAyC,CAAC;AACnG,eAAO,MAAM,6CAA6C,gGAA0C,CAAC;AACrG,eAAO,MAAM,0CAA0C,gGAAmD,CAAC;AAC3G,eAAO,MAAM,0CAA0C,gGAAmD,CAAC;AAC3G,eAAO,MAAM,0CAA0C,gGAAmD,CAAC;AAC3G,eAAO,MAAM,4CAA4C,gGAAmD,CAAC;AAC7G,eAAO,MAAM,iDAAiD,gGAAwD,CAAC;AACvH,eAAO,MAAM,8CAA8C,gGAAwD,CAAC"}
|