@lukoweb/apitogo 0.1.39 → 0.1.40

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/cli/cli.js CHANGED
@@ -2914,100 +2914,66 @@ var init_icon_types = __esm({
2914
2914
  }
2915
2915
  });
2916
2916
 
2917
- // src/config/validators/HeaderNavigationSchema.ts
2918
- import { z as z5 } from "zod";
2919
- var IconSchema, HeaderNavLinkItemSchema, HeaderNavGroupSchema, HeaderNavItemSchema, HeaderNavigationSchema;
2920
- var init_HeaderNavigationSchema = __esm({
2921
- "src/config/validators/HeaderNavigationSchema.ts"() {
2922
- init_icon_types();
2923
- IconSchema = z5.enum(IconNames);
2924
- HeaderNavLinkItemSchema = z5.object({
2925
- label: z5.string(),
2926
- icon: IconSchema.optional(),
2927
- description: z5.string().optional(),
2928
- to: z5.string(),
2929
- target: z5.enum(["_self", "_blank"]).optional()
2930
- });
2931
- HeaderNavGroupSchema = z5.object({
2932
- label: z5.string(),
2933
- items: z5.array(HeaderNavLinkItemSchema)
2934
- });
2935
- HeaderNavItemSchema = z5.union([
2936
- z5.object({
2937
- label: z5.string(),
2938
- icon: IconSchema.optional(),
2939
- to: z5.string(),
2940
- target: z5.enum(["_self", "_blank"]).optional()
2941
- }),
2942
- z5.object({
2943
- label: z5.string(),
2944
- items: z5.array(z5.union([HeaderNavLinkItemSchema, HeaderNavGroupSchema]))
2945
- })
2946
- ]);
2947
- HeaderNavigationSchema = z5.array(HeaderNavItemSchema);
2948
- }
2949
- });
2950
-
2951
2917
  // src/config/validators/InputNavigationSchema.ts
2952
- import { z as z6 } from "zod";
2953
- var IconSchema2, BadgeSchema, InputNavigationCategoryLinkDocSchema, DisplaySchema, NavigationModifyRuleSchema, NavigationInsertRuleSchema, NavigationRemoveRuleSchema, NavigationSortRuleSchema, NavigationMoveRuleSchema, NavigationRuleSchema, NavigationRulesSchema, InputNavigationDocSchema, InputNavigationLinkSchema, InputNavigationCustomPageSchema, InputNavigationSeparatorSchema, InputNavigationSectionSchema, InputNavigationFilterSchema, BaseInputNavigationCategorySchema, InputNavigationCategorySchema, InputNavigationItemSchema, InputNavigationSchema;
2918
+ import { z as z5 } from "zod";
2919
+ var IconSchema, BadgeSchema, InputNavigationCategoryLinkDocSchema, DisplaySchema, NavigationModifyRuleSchema, NavigationInsertRuleSchema, NavigationRemoveRuleSchema, NavigationSortRuleSchema, NavigationMoveRuleSchema, NavigationRuleSchema, NavigationRulesSchema, InputNavigationDocSchema, InputNavigationLinkSchema, InputNavigationCustomPageSchema, InputNavigationSeparatorSchema, InputNavigationSectionSchema, InputNavigationFilterSchema, BaseInputNavigationCategorySchema, InputNavigationCategorySchema, InputNavigationItemSchema, InputNavigationSchema;
2954
2920
  var init_InputNavigationSchema = __esm({
2955
2921
  "src/config/validators/InputNavigationSchema.ts"() {
2956
- IconSchema2 = z6.custom((f) => typeof f === "string");
2957
- BadgeSchema = z6.object({
2958
- label: z6.string(),
2922
+ IconSchema = z5.custom((f) => typeof f === "string");
2923
+ BadgeSchema = z5.object({
2924
+ label: z5.string(),
2959
2925
  // prettier-ignore
2960
- color: z6.enum(["green", "blue", "yellow", "red", "purple", "indigo", "gray", "outline"]),
2961
- invert: z6.boolean().optional(),
2962
- className: z6.string().optional()
2926
+ color: z5.enum(["green", "blue", "yellow", "red", "purple", "indigo", "gray", "outline"]),
2927
+ invert: z5.boolean().optional(),
2928
+ className: z5.string().optional()
2963
2929
  });
2964
- InputNavigationCategoryLinkDocSchema = z6.union([
2965
- z6.string(),
2966
- z6.object({
2967
- type: z6.literal("doc"),
2968
- file: z6.string(),
2969
- label: z6.string().optional(),
2970
- path: z6.string().optional()
2930
+ InputNavigationCategoryLinkDocSchema = z5.union([
2931
+ z5.string(),
2932
+ z5.object({
2933
+ type: z5.literal("doc"),
2934
+ file: z5.string(),
2935
+ label: z5.string().optional(),
2936
+ path: z5.string().optional()
2971
2937
  })
2972
2938
  ]);
2973
- DisplaySchema = z6.union([
2974
- z6.enum(["auth", "anon", "always", "hide"]),
2975
- z6.custom((val) => typeof val === "function")
2939
+ DisplaySchema = z5.union([
2940
+ z5.enum(["auth", "anon", "always", "hide"]),
2941
+ z5.custom((val) => typeof val === "function")
2976
2942
  ]).optional();
2977
- NavigationModifyRuleSchema = z6.object({
2978
- type: z6.literal("modify"),
2979
- match: z6.string(),
2980
- set: z6.object({
2981
- label: z6.string().optional(),
2982
- icon: IconSchema2.optional(),
2943
+ NavigationModifyRuleSchema = z5.object({
2944
+ type: z5.literal("modify"),
2945
+ match: z5.string(),
2946
+ set: z5.object({
2947
+ label: z5.string().optional(),
2948
+ icon: IconSchema.optional(),
2983
2949
  badge: BadgeSchema.optional(),
2984
- collapsed: z6.boolean().optional(),
2985
- collapsible: z6.boolean().optional(),
2950
+ collapsed: z5.boolean().optional(),
2951
+ collapsible: z5.boolean().optional(),
2986
2952
  display: DisplaySchema
2987
2953
  })
2988
2954
  });
2989
- NavigationInsertRuleSchema = z6.object({
2990
- type: z6.literal("insert"),
2991
- match: z6.string(),
2992
- position: z6.enum(["before", "after"]),
2993
- items: z6.lazy(() => InputNavigationItemSchema.array())
2955
+ NavigationInsertRuleSchema = z5.object({
2956
+ type: z5.literal("insert"),
2957
+ match: z5.string(),
2958
+ position: z5.enum(["before", "after"]),
2959
+ items: z5.lazy(() => InputNavigationItemSchema.array())
2994
2960
  });
2995
- NavigationRemoveRuleSchema = z6.object({
2996
- type: z6.literal("remove"),
2997
- match: z6.string()
2961
+ NavigationRemoveRuleSchema = z5.object({
2962
+ type: z5.literal("remove"),
2963
+ match: z5.string()
2998
2964
  });
2999
- NavigationSortRuleSchema = z6.object({
3000
- type: z6.literal("sort"),
3001
- match: z6.string(),
3002
- by: z6.custom((val) => typeof val === "function")
2965
+ NavigationSortRuleSchema = z5.object({
2966
+ type: z5.literal("sort"),
2967
+ match: z5.string(),
2968
+ by: z5.custom((val) => typeof val === "function")
3003
2969
  });
3004
- NavigationMoveRuleSchema = z6.object({
3005
- type: z6.literal("move"),
3006
- match: z6.string(),
3007
- to: z6.string(),
3008
- position: z6.enum(["before", "after"])
2970
+ NavigationMoveRuleSchema = z5.object({
2971
+ type: z5.literal("move"),
2972
+ match: z5.string(),
2973
+ to: z5.string(),
2974
+ position: z5.enum(["before", "after"])
3009
2975
  });
3010
- NavigationRuleSchema = z6.discriminatedUnion("type", [
2976
+ NavigationRuleSchema = z5.discriminatedUnion("type", [
3011
2977
  NavigationModifyRuleSchema,
3012
2978
  NavigationInsertRuleSchema,
3013
2979
  NavigationRemoveRuleSchema,
@@ -3015,65 +2981,65 @@ var init_InputNavigationSchema = __esm({
3015
2981
  NavigationMoveRuleSchema
3016
2982
  ]);
3017
2983
  NavigationRulesSchema = NavigationRuleSchema.array();
3018
- InputNavigationDocSchema = z6.union([
3019
- z6.string(),
3020
- z6.object({
3021
- type: z6.literal("doc"),
3022
- file: z6.string(),
2984
+ InputNavigationDocSchema = z5.union([
2985
+ z5.string(),
2986
+ z5.object({
2987
+ type: z5.literal("doc"),
2988
+ file: z5.string(),
3023
2989
  // Custom URL path for this document (overrides file-based path)
3024
- path: z6.string().optional(),
3025
- icon: IconSchema2.optional(),
3026
- label: z6.string().optional(),
2990
+ path: z5.string().optional(),
2991
+ icon: IconSchema.optional(),
2992
+ label: z5.string().optional(),
3027
2993
  badge: BadgeSchema.optional(),
3028
2994
  display: DisplaySchema
3029
2995
  })
3030
2996
  ]);
3031
- InputNavigationLinkSchema = z6.object({
3032
- type: z6.literal("link"),
3033
- to: z6.string(),
3034
- label: z6.string(),
3035
- target: z6.enum(["_self", "_blank"]).optional(),
3036
- icon: IconSchema2.optional(),
2997
+ InputNavigationLinkSchema = z5.object({
2998
+ type: z5.literal("link"),
2999
+ to: z5.string(),
3000
+ label: z5.string(),
3001
+ target: z5.enum(["_self", "_blank"]).optional(),
3002
+ icon: IconSchema.optional(),
3037
3003
  badge: BadgeSchema.optional(),
3038
3004
  display: DisplaySchema
3039
3005
  });
3040
- InputNavigationCustomPageSchema = z6.object({
3041
- type: z6.literal("custom-page"),
3042
- path: z6.string(),
3043
- label: z6.string().optional(),
3044
- element: z6.any(),
3045
- icon: IconSchema2.optional(),
3006
+ InputNavigationCustomPageSchema = z5.object({
3007
+ type: z5.literal("custom-page"),
3008
+ path: z5.string(),
3009
+ label: z5.string().optional(),
3010
+ element: z5.any(),
3011
+ icon: IconSchema.optional(),
3046
3012
  badge: BadgeSchema.optional(),
3047
3013
  display: DisplaySchema,
3048
- layout: z6.enum(["default", "none"]).optional()
3014
+ layout: z5.enum(["default", "none"]).optional()
3049
3015
  });
3050
- InputNavigationSeparatorSchema = z6.object({
3051
- type: z6.literal("separator"),
3016
+ InputNavigationSeparatorSchema = z5.object({
3017
+ type: z5.literal("separator"),
3052
3018
  display: DisplaySchema
3053
3019
  });
3054
- InputNavigationSectionSchema = z6.object({
3055
- type: z6.literal("section"),
3056
- label: z6.string(),
3020
+ InputNavigationSectionSchema = z5.object({
3021
+ type: z5.literal("section"),
3022
+ label: z5.string(),
3057
3023
  display: DisplaySchema
3058
3024
  });
3059
- InputNavigationFilterSchema = z6.object({
3060
- type: z6.literal("filter"),
3061
- placeholder: z6.string().optional(),
3025
+ InputNavigationFilterSchema = z5.object({
3026
+ type: z5.literal("filter"),
3027
+ placeholder: z5.string().optional(),
3062
3028
  display: DisplaySchema
3063
3029
  });
3064
- BaseInputNavigationCategorySchema = z6.object({
3065
- type: z6.literal("category"),
3066
- icon: IconSchema2.optional(),
3067
- label: z6.string(),
3068
- collapsible: z6.boolean().optional(),
3069
- collapsed: z6.boolean().optional(),
3030
+ BaseInputNavigationCategorySchema = z5.object({
3031
+ type: z5.literal("category"),
3032
+ icon: IconSchema.optional(),
3033
+ label: z5.string(),
3034
+ collapsible: z5.boolean().optional(),
3035
+ collapsed: z5.boolean().optional(),
3070
3036
  link: InputNavigationCategoryLinkDocSchema.optional(),
3071
3037
  display: DisplaySchema
3072
3038
  });
3073
3039
  InputNavigationCategorySchema = BaseInputNavigationCategorySchema.extend({
3074
- items: z6.lazy(() => InputNavigationItemSchema.array())
3040
+ items: z5.lazy(() => InputNavigationItemSchema.array())
3075
3041
  });
3076
- InputNavigationItemSchema = z6.union([
3042
+ InputNavigationItemSchema = z5.union([
3077
3043
  InputNavigationDocSchema,
3078
3044
  InputNavigationLinkSchema,
3079
3045
  InputNavigationCustomPageSchema,
@@ -3086,6 +3052,43 @@ var init_InputNavigationSchema = __esm({
3086
3052
  }
3087
3053
  });
3088
3054
 
3055
+ // src/config/validators/HeaderNavigationSchema.ts
3056
+ import { z as z6 } from "zod";
3057
+ var IconSchema2, HeaderNavLinkItemSchema, HeaderNavGroupSchema, HeaderNavItemSchema, HeaderNavigationSchema;
3058
+ var init_HeaderNavigationSchema = __esm({
3059
+ "src/config/validators/HeaderNavigationSchema.ts"() {
3060
+ init_icon_types();
3061
+ init_InputNavigationSchema();
3062
+ IconSchema2 = z6.enum(IconNames);
3063
+ HeaderNavLinkItemSchema = z6.object({
3064
+ label: z6.string(),
3065
+ icon: IconSchema2.optional(),
3066
+ description: z6.string().optional(),
3067
+ to: z6.string(),
3068
+ target: z6.enum(["_self", "_blank"]).optional(),
3069
+ display: DisplaySchema
3070
+ });
3071
+ HeaderNavGroupSchema = z6.object({
3072
+ label: z6.string(),
3073
+ items: z6.array(HeaderNavLinkItemSchema)
3074
+ });
3075
+ HeaderNavItemSchema = z6.union([
3076
+ z6.object({
3077
+ label: z6.string(),
3078
+ icon: IconSchema2.optional(),
3079
+ to: z6.string(),
3080
+ target: z6.enum(["_self", "_blank"]).optional(),
3081
+ display: DisplaySchema
3082
+ }),
3083
+ z6.object({
3084
+ label: z6.string(),
3085
+ items: z6.array(z6.union([HeaderNavLinkItemSchema, HeaderNavGroupSchema]))
3086
+ })
3087
+ ]);
3088
+ HeaderNavigationSchema = z6.array(HeaderNavItemSchema);
3089
+ }
3090
+ });
3091
+
3089
3092
  // src/lib/util/joinUrl.ts
3090
3093
  var defaultUrlRegExp, normalizeParts, parseParts, buildUrl, joinUrl;
3091
3094
  var init_joinUrl = __esm({
@@ -4121,7 +4124,7 @@ import {
4121
4124
  // package.json
4122
4125
  var package_default = {
4123
4126
  name: "@lukoweb/apitogo",
4124
- version: "0.1.39",
4127
+ version: "0.1.40",
4125
4128
  type: "module",
4126
4129
  sideEffects: [
4127
4130
  "**/*.css",
@@ -1960,6 +1960,18 @@ declare const HeaderNavLinkItemSchema: z.ZodObject<{
1960
1960
  _self: "_self";
1961
1961
  _blank: "_blank";
1962
1962
  }>>;
1963
+ display: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
1964
+ auth: "auth";
1965
+ anon: "anon";
1966
+ always: "always";
1967
+ hide: "hide";
1968
+ }>, z.ZodCustom<(params: {
1969
+ context: import("../../index.js").ZudokuContext;
1970
+ auth: import("../../lib/authentication/hook.js").UseAuthReturn;
1971
+ }) => boolean, (params: {
1972
+ context: import("../../index.js").ZudokuContext;
1973
+ auth: import("../../lib/authentication/hook.js").UseAuthReturn;
1974
+ }) => boolean>]>>;
1963
1975
  }, z.core.$strip>;
1964
1976
  declare const HeaderNavGroupSchema: z.ZodObject<{
1965
1977
  label: z.ZodString;
@@ -3924,6 +3936,18 @@ declare const HeaderNavGroupSchema: z.ZodObject<{
3924
3936
  _self: "_self";
3925
3937
  _blank: "_blank";
3926
3938
  }>>;
3939
+ display: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
3940
+ auth: "auth";
3941
+ anon: "anon";
3942
+ always: "always";
3943
+ hide: "hide";
3944
+ }>, z.ZodCustom<(params: {
3945
+ context: import("../../index.js").ZudokuContext;
3946
+ auth: import("../../lib/authentication/hook.js").UseAuthReturn;
3947
+ }) => boolean, (params: {
3948
+ context: import("../../index.js").ZudokuContext;
3949
+ auth: import("../../lib/authentication/hook.js").UseAuthReturn;
3950
+ }) => boolean>]>>;
3927
3951
  }, z.core.$strip>>;
3928
3952
  }, z.core.$strip>;
3929
3953
  declare const HeaderNavItemSchema: z.ZodUnion<readonly [z.ZodObject<{
@@ -5886,6 +5910,18 @@ declare const HeaderNavItemSchema: z.ZodUnion<readonly [z.ZodObject<{
5886
5910
  _self: "_self";
5887
5911
  _blank: "_blank";
5888
5912
  }>>;
5913
+ display: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
5914
+ auth: "auth";
5915
+ anon: "anon";
5916
+ always: "always";
5917
+ hide: "hide";
5918
+ }>, z.ZodCustom<(params: {
5919
+ context: import("../../index.js").ZudokuContext;
5920
+ auth: import("../../lib/authentication/hook.js").UseAuthReturn;
5921
+ }) => boolean, (params: {
5922
+ context: import("../../index.js").ZudokuContext;
5923
+ auth: import("../../lib/authentication/hook.js").UseAuthReturn;
5924
+ }) => boolean>]>>;
5889
5925
  }, z.core.$strip>, z.ZodObject<{
5890
5926
  label: z.ZodString;
5891
5927
  items: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
@@ -7849,6 +7885,18 @@ declare const HeaderNavItemSchema: z.ZodUnion<readonly [z.ZodObject<{
7849
7885
  _self: "_self";
7850
7886
  _blank: "_blank";
7851
7887
  }>>;
7888
+ display: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
7889
+ auth: "auth";
7890
+ anon: "anon";
7891
+ always: "always";
7892
+ hide: "hide";
7893
+ }>, z.ZodCustom<(params: {
7894
+ context: import("../../index.js").ZudokuContext;
7895
+ auth: import("../../lib/authentication/hook.js").UseAuthReturn;
7896
+ }) => boolean, (params: {
7897
+ context: import("../../index.js").ZudokuContext;
7898
+ auth: import("../../lib/authentication/hook.js").UseAuthReturn;
7899
+ }) => boolean>]>>;
7852
7900
  }, z.core.$strip>, z.ZodObject<{
7853
7901
  label: z.ZodString;
7854
7902
  items: z.ZodArray<z.ZodObject<{
@@ -9812,6 +9860,18 @@ declare const HeaderNavItemSchema: z.ZodUnion<readonly [z.ZodObject<{
9812
9860
  _self: "_self";
9813
9861
  _blank: "_blank";
9814
9862
  }>>;
9863
+ display: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
9864
+ auth: "auth";
9865
+ anon: "anon";
9866
+ always: "always";
9867
+ hide: "hide";
9868
+ }>, z.ZodCustom<(params: {
9869
+ context: import("../../index.js").ZudokuContext;
9870
+ auth: import("../../lib/authentication/hook.js").UseAuthReturn;
9871
+ }) => boolean, (params: {
9872
+ context: import("../../index.js").ZudokuContext;
9873
+ auth: import("../../lib/authentication/hook.js").UseAuthReturn;
9874
+ }) => boolean>]>>;
9815
9875
  }, z.core.$strip>>;
9816
9876
  }, z.core.$strip>]>>;
9817
9877
  }, z.core.$strip>]>;
@@ -11775,6 +11835,18 @@ export declare const HeaderNavigationSchema: z.ZodArray<z.ZodUnion<readonly [z.Z
11775
11835
  _self: "_self";
11776
11836
  _blank: "_blank";
11777
11837
  }>>;
11838
+ display: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
11839
+ auth: "auth";
11840
+ anon: "anon";
11841
+ always: "always";
11842
+ hide: "hide";
11843
+ }>, z.ZodCustom<(params: {
11844
+ context: import("../../index.js").ZudokuContext;
11845
+ auth: import("../../lib/authentication/hook.js").UseAuthReturn;
11846
+ }) => boolean, (params: {
11847
+ context: import("../../index.js").ZudokuContext;
11848
+ auth: import("../../lib/authentication/hook.js").UseAuthReturn;
11849
+ }) => boolean>]>>;
11778
11850
  }, z.core.$strip>, z.ZodObject<{
11779
11851
  label: z.ZodString;
11780
11852
  items: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
@@ -13738,6 +13810,18 @@ export declare const HeaderNavigationSchema: z.ZodArray<z.ZodUnion<readonly [z.Z
13738
13810
  _self: "_self";
13739
13811
  _blank: "_blank";
13740
13812
  }>>;
13813
+ display: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
13814
+ auth: "auth";
13815
+ anon: "anon";
13816
+ always: "always";
13817
+ hide: "hide";
13818
+ }>, z.ZodCustom<(params: {
13819
+ context: import("../../index.js").ZudokuContext;
13820
+ auth: import("../../lib/authentication/hook.js").UseAuthReturn;
13821
+ }) => boolean, (params: {
13822
+ context: import("../../index.js").ZudokuContext;
13823
+ auth: import("../../lib/authentication/hook.js").UseAuthReturn;
13824
+ }) => boolean>]>>;
13741
13825
  }, z.core.$strip>, z.ZodObject<{
13742
13826
  label: z.ZodString;
13743
13827
  items: z.ZodArray<z.ZodObject<{
@@ -15701,6 +15785,18 @@ export declare const HeaderNavigationSchema: z.ZodArray<z.ZodUnion<readonly [z.Z
15701
15785
  _self: "_self";
15702
15786
  _blank: "_blank";
15703
15787
  }>>;
15788
+ display: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
15789
+ auth: "auth";
15790
+ anon: "anon";
15791
+ always: "always";
15792
+ hide: "hide";
15793
+ }>, z.ZodCustom<(params: {
15794
+ context: import("../../index.js").ZudokuContext;
15795
+ auth: import("../../lib/authentication/hook.js").UseAuthReturn;
15796
+ }) => boolean, (params: {
15797
+ context: import("../../index.js").ZudokuContext;
15798
+ auth: import("../../lib/authentication/hook.js").UseAuthReturn;
15799
+ }) => boolean>]>>;
15704
15800
  }, z.core.$strip>>;
15705
15801
  }, z.core.$strip>]>>;
15706
15802
  }, z.core.$strip>]>>;
@@ -2487,6 +2487,18 @@ export declare const ZudokuConfig: z.ZodObject<{
2487
2487
  _self: "_self";
2488
2488
  _blank: "_blank";
2489
2489
  }>>;
2490
+ display: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
2491
+ auth: "auth";
2492
+ anon: "anon";
2493
+ always: "always";
2494
+ hide: "hide";
2495
+ }>, z.ZodCustom<(params: {
2496
+ context: ZudokuContext;
2497
+ auth: UseAuthReturn;
2498
+ }) => boolean, (params: {
2499
+ context: ZudokuContext;
2500
+ auth: UseAuthReturn;
2501
+ }) => boolean>]>>;
2490
2502
  }, z.core.$strip>, z.ZodObject<{
2491
2503
  label: z.ZodString;
2492
2504
  items: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
@@ -4450,6 +4462,18 @@ export declare const ZudokuConfig: z.ZodObject<{
4450
4462
  _self: "_self";
4451
4463
  _blank: "_blank";
4452
4464
  }>>;
4465
+ display: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
4466
+ auth: "auth";
4467
+ anon: "anon";
4468
+ always: "always";
4469
+ hide: "hide";
4470
+ }>, z.ZodCustom<(params: {
4471
+ context: ZudokuContext;
4472
+ auth: UseAuthReturn;
4473
+ }) => boolean, (params: {
4474
+ context: ZudokuContext;
4475
+ auth: UseAuthReturn;
4476
+ }) => boolean>]>>;
4453
4477
  }, z.core.$strip>, z.ZodObject<{
4454
4478
  label: z.ZodString;
4455
4479
  items: z.ZodArray<z.ZodObject<{
@@ -6413,6 +6437,18 @@ export declare const ZudokuConfig: z.ZodObject<{
6413
6437
  _self: "_self";
6414
6438
  _blank: "_blank";
6415
6439
  }>>;
6440
+ display: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
6441
+ auth: "auth";
6442
+ anon: "anon";
6443
+ always: "always";
6444
+ hide: "hide";
6445
+ }>, z.ZodCustom<(params: {
6446
+ context: ZudokuContext;
6447
+ auth: UseAuthReturn;
6448
+ }) => boolean, (params: {
6449
+ context: ZudokuContext;
6450
+ auth: UseAuthReturn;
6451
+ }) => boolean>]>>;
6416
6452
  }, z.core.$strip>>;
6417
6453
  }, z.core.$strip>]>>;
6418
6454
  }, z.core.$strip>]>>>;
@@ -3,6 +3,8 @@ export type DevPortalAuthMode = "live" | "preview";
3
3
  export type EndUserMeResponse = {
4
4
  userId: string;
5
5
  displayName: string | null;
6
+ email?: string | null;
7
+ emailVerified?: boolean | null;
6
8
  subscriptions: Array<{
7
9
  planSku: string;
8
10
  status: string;
@@ -18,7 +18,6 @@ export declare class DevPortalAuthenticationProvider extends CoreAuthenticationP
18
18
  private readonly redirectToAfterSignIn;
19
19
  private readonly redirectToAfterSignUp;
20
20
  private readonly redirectToAfterSignOut;
21
- private authMode;
22
21
  private backendAvailable;
23
22
  private refreshGeneration;
24
23
  private refreshInFlight;
@@ -27,7 +26,7 @@ export declare class DevPortalAuthenticationProvider extends CoreAuthenticationP
27
26
  onPageLoad: () => Promise<void>;
28
27
  private syncBackendAvailability;
29
28
  private setPreviewState;
30
- private ensureLiveBackend;
29
+ private ensureConfiguredBackend;
31
30
  refreshUserProfile(): Promise<boolean>;
32
31
  private refreshUserProfileInternal;
33
32
  signIn(_: AuthActionContext, { redirectTo }?: AuthActionOptions): Promise<void>;
@@ -1,44 +1,45 @@
1
1
  export type _Schema1 = ("a-arrow-down" | "a-arrow-up" | "a-large-small" | "accessibility" | "activity" | "activity-square" | "air-vent" | "airplay" | "alarm-check" | "alarm-clock" | "alarm-clock-check" | "alarm-clock-minus" | "alarm-clock-off" | "alarm-clock-plus" | "alarm-minus" | "alarm-plus" | "alarm-smoke" | "album" | "alert-circle" | "alert-octagon" | "alert-triangle" | "align-center" | "align-center-horizontal" | "align-center-vertical" | "align-end-horizontal" | "align-end-vertical" | "align-horizontal-distribute-center" | "align-horizontal-distribute-end" | "align-horizontal-distribute-start" | "align-horizontal-justify-center" | "align-horizontal-justify-end" | "align-horizontal-justify-start" | "align-horizontal-space-around" | "align-horizontal-space-between" | "align-justify" | "align-left" | "align-right" | "align-start-horizontal" | "align-start-vertical" | "align-vertical-distribute-center" | "align-vertical-distribute-end" | "align-vertical-distribute-start" | "align-vertical-justify-center" | "align-vertical-justify-end" | "align-vertical-justify-start" | "align-vertical-space-around" | "align-vertical-space-between" | "ambulance" | "ampersand" | "ampersands" | "amphora" | "anchor" | "angry" | "annoyed" | "antenna" | "anvil" | "aperture" | "app-window" | "app-window-mac" | "apple" | "archive" | "archive-restore" | "archive-x" | "area-chart" | "armchair" | "arrow-big-down" | "arrow-big-down-dash" | "arrow-big-left" | "arrow-big-left-dash" | "arrow-big-right" | "arrow-big-right-dash" | "arrow-big-up" | "arrow-big-up-dash" | "arrow-down" | "arrow-down-0-1" | "arrow-down-01" | "arrow-down-1-0" | "arrow-down-10" | "arrow-down-a-z" | "arrow-down-az" | "arrow-down-circle" | "arrow-down-from-line" | "arrow-down-left" | "arrow-down-left-from-circle" | "arrow-down-left-from-square" | "arrow-down-left-square" | "arrow-down-narrow-wide" | "arrow-down-right" | "arrow-down-right-from-circle" | "arrow-down-right-from-square" | "arrow-down-right-square" | "arrow-down-square" | "arrow-down-to-dot" | "arrow-down-to-line" | "arrow-down-up" | "arrow-down-wide-narrow" | "arrow-down-z-a" | "arrow-down-za" | "arrow-left" | "arrow-left-circle" | "arrow-left-from-line" | "arrow-left-right" | "arrow-left-square" | "arrow-left-to-line" | "arrow-right" | "arrow-right-circle" | "arrow-right-from-line" | "arrow-right-left" | "arrow-right-square" | "arrow-right-to-line" | "arrow-up" | "arrow-up-0-1" | "arrow-up-01" | "arrow-up-1-0" | "arrow-up-10" | "arrow-up-a-z" | "arrow-up-az" | "arrow-up-circle" | "arrow-up-down" | "arrow-up-from-dot" | "arrow-up-from-line" | "arrow-up-left" | "arrow-up-left-from-circle" | "arrow-up-left-from-square" | "arrow-up-left-square" | "arrow-up-narrow-wide" | "arrow-up-right" | "arrow-up-right-from-circle" | "arrow-up-right-from-square" | "arrow-up-right-square" | "arrow-up-square" | "arrow-up-to-line" | "arrow-up-wide-narrow" | "arrow-up-z-a" | "arrow-up-za" | "arrows-up-from-line" | "asterisk" | "asterisk-square" | "at-sign" | "atom" | "audio-lines" | "audio-waveform" | "award" | "axe" | "axis-3-d" | "axis-3d" | "baby" | "backpack" | "badge" | "badge-alert" | "badge-cent" | "badge-check" | "badge-dollar-sign" | "badge-euro" | "badge-help" | "badge-indian-rupee" | "badge-info" | "badge-japanese-yen" | "badge-minus" | "badge-percent" | "badge-plus" | "badge-pound-sterling" | "badge-question-mark" | "badge-russian-ruble" | "badge-swiss-franc" | "badge-turkish-lira" | "badge-x" | "baggage-claim" | "balloon" | "ban" | "banana" | "bandage" | "banknote" | "banknote-arrow-down" | "banknote-arrow-up" | "banknote-x" | "bar-chart" | "bar-chart-2" | "bar-chart-3" | "bar-chart-4" | "bar-chart-big" | "bar-chart-horizontal" | "bar-chart-horizontal-big" | "barcode" | "barrel" | "baseline" | "bath" | "battery" | "battery-charging" | "battery-full" | "battery-low" | "battery-medium" | "battery-plus" | "battery-warning" | "beaker" | "bean" | "bean-off" | "bed" | "bed-double" | "bed-single" | "beef" | "beer" | "beer-off" | "bell" | "bell-dot" | "bell-electric" | "bell-minus" | "bell-off" | "bell-plus" | "bell-ring" | "between-horizonal-end" | "between-horizonal-start" | "between-horizontal-end" | "between-horizontal-start" | "between-vertical-end" | "between-vertical-start" | "biceps-flexed" | "bike" | "binary" | "binoculars" | "biohazard" | "bird" | "birdhouse" | "bitcoin" | "blend" | "blinds" | "blocks" | "bluetooth" | "bluetooth-connected" | "bluetooth-off" | "bluetooth-searching" | "bold" | "bolt" | "bomb" | "bone" | "book" | "book-a" | "book-alert" | "book-audio" | "book-check" | "book-copy" | "book-dashed" | "book-down" | "book-headphones" | "book-heart" | "book-image" | "book-key" | "book-lock" | "book-marked" | "book-minus" | "book-open" | "book-open-check" | "book-open-text" | "book-plus" | "book-search" | "book-template" | "book-text" | "book-type" | "book-up" | "book-up-2" | "book-user" | "book-x" | "bookmark" | "bookmark-check" | "bookmark-minus" | "bookmark-plus" | "bookmark-x" | "boom-box" | "bot" | "bot-message-square" | "bot-off" | "bottle-wine" | "bow-arrow" | "box" | "box-select" | "boxes" | "braces" | "brackets" | "brain" | "brain-circuit" | "brain-cog" | "brick-wall" | "brick-wall-fire" | "brick-wall-shield" | "briefcase" | "briefcase-business" | "briefcase-conveyor-belt" | "briefcase-medical" | "bring-to-front" | "brush" | "brush-cleaning" | "bubbles" | "bug" | "bug-off" | "bug-play" | "building" | "building-2" | "bus" | "bus-front" | "cable" | "cable-car" | "cake" | "cake-slice" | "calculator" | "calendar" | "calendar-1" | "calendar-arrow-down" | "calendar-arrow-up" | "calendar-check" | "calendar-check-2" | "calendar-clock" | "calendar-cog" | "calendar-days" | "calendar-fold" | "calendar-heart" | "calendar-minus" | "calendar-minus-2" | "calendar-off" | "calendar-plus" | "calendar-plus-2" | "calendar-range" | "calendar-search" | "calendar-sync" | "calendar-x" | "calendar-x-2" | "calendars" | "camera" | "camera-off" | "candlestick-chart" | "candy" | "candy-cane" | "candy-off" | "cannabis" | "cannabis-off" | "captions" | "captions-off" | "car" | "car-front" | "car-taxi-front" | "caravan" | "card-sim" | "carrot" | "case-lower" | "case-sensitive" | "case-upper" | "cassette-tape" | "cast" | "castle" | "cat" | "cctv" | "chart-area" | "chart-bar" | "chart-bar-big" | "chart-bar-decreasing" | "chart-bar-increasing" | "chart-bar-stacked" | "chart-candlestick" | "chart-column" | "chart-column-big" | "chart-column-decreasing" | "chart-column-increasing" | "chart-column-stacked" | "chart-gantt" | "chart-line" | "chart-network" | "chart-no-axes-column" | "chart-no-axes-column-decreasing" | "chart-no-axes-column-increasing" | "chart-no-axes-combined" | "chart-no-axes-gantt" | "chart-pie" | "chart-scatter" | "chart-spline" | "check" | "check-check" | "check-circle" | "check-circle-2" | "check-line" | "check-square" | "check-square-2" | "chef-hat" | "cherry" | "chess-bishop" | "chess-king" | "chess-knight" | "chess-pawn" | "chess-queen" | "chess-rook" | "chevron-down" | "chevron-down-circle" | "chevron-down-square" | "chevron-first" | "chevron-last" | "chevron-left" | "chevron-left-circle" | "chevron-left-square" | "chevron-right" | "chevron-right-circle" | "chevron-right-square" | "chevron-up" | "chevron-up-circle" | "chevron-up-square" | "chevrons-down" | "chevrons-down-up" | "chevrons-left" | "chevrons-left-right" | "chevrons-left-right-ellipsis" | "chevrons-right" | "chevrons-right-left" | "chevrons-up" | "chevrons-up-down" | "chrome" | "chromium" | "church" | "cigarette" | "cigarette-off" | "circle" | "circle-alert" | "circle-arrow-down" | "circle-arrow-left" | "circle-arrow-out-down-left" | "circle-arrow-out-down-right" | "circle-arrow-out-up-left" | "circle-arrow-out-up-right" | "circle-arrow-right" | "circle-arrow-up" | "circle-check" | "circle-check-big" | "circle-chevron-down" | "circle-chevron-left" | "circle-chevron-right" | "circle-chevron-up" | "circle-dashed" | "circle-divide" | "circle-dollar-sign" | "circle-dot" | "circle-dot-dashed" | "circle-ellipsis" | "circle-equal" | "circle-fading-arrow-up" | "circle-fading-plus" | "circle-gauge" | "circle-help" | "circle-minus" | "circle-off" | "circle-parking" | "circle-parking-off" | "circle-pause" | "circle-percent" | "circle-pile" | "circle-play" | "circle-plus" | "circle-pound-sterling" | "circle-power" | "circle-question-mark" | "circle-slash" | "circle-slash-2" | "circle-slashed" | "circle-small" | "circle-star" | "circle-stop" | "circle-user" | "circle-user-round" | "circle-x" | "circuit-board" | "citrus" | "clapperboard" | "clipboard" | "clipboard-check" | "clipboard-clock" | "clipboard-copy" | "clipboard-edit" | "clipboard-list" | "clipboard-minus" | "clipboard-paste" | "clipboard-pen" | "clipboard-pen-line" | "clipboard-plus" | "clipboard-signature" | "clipboard-type" | "clipboard-x" | "clock" | "clock-1" | "clock-10" | "clock-11" | "clock-12" | "clock-2" | "clock-3" | "clock-4" | "clock-5" | "clock-6" | "clock-7" | "clock-8" | "clock-9" | "clock-alert" | "clock-arrow-down" | "clock-arrow-up" | "clock-check" | "clock-fading" | "clock-plus" | "closed-caption" | "cloud" | "cloud-alert" | "cloud-backup" | "cloud-check" | "cloud-cog" | "cloud-download" | "cloud-drizzle" | "cloud-fog" | "cloud-hail" | "cloud-lightning" | "cloud-moon" | "cloud-moon-rain" | "cloud-off" | "cloud-rain" | "cloud-rain-wind" | "cloud-snow" | "cloud-sun" | "cloud-sun-rain" | "cloud-sync" | "cloud-upload" | "cloudy" | "clover" | "club" | "code" | "code-2" | "code-square" | "code-xml" | "codepen" | "codesandbox" | "coffee" | "cog" | "coins" | "columns" | "columns-2" | "columns-3" | "columns-3-cog" | "columns-4" | "columns-settings" | "combine" | "command" | "compass" | "component" | "computer" | "concierge-bell" | "cone" | "construction" | "contact" | "contact-2" | "contact-round" | "container" | "contrast" | "cookie" | "cooking-pot" | "copy" | "copy-check" | "copy-minus" | "copy-plus" | "copy-slash" | "copy-x" | "copyleft" | "copyright" | "corner-down-left" | "corner-down-right" | "corner-left-down" | "corner-left-up" | "corner-right-down" | "corner-right-up" | "corner-up-left" | "corner-up-right" | "cpu" | "creative-commons" | "credit-card" | "croissant" | "crop" | "cross" | "crosshair" | "crown" | "cuboid" | "cup-soda" | "curly-braces" | "currency" | "cylinder" | "dam" | "database" | "database-backup" | "database-search" | "database-zap" | "decimals-arrow-left" | "decimals-arrow-right" | "delete" | "dessert" | "diameter" | "diamond" | "diamond-minus" | "diamond-percent" | "diamond-plus" | "dice-1" | "dice-2" | "dice-3" | "dice-4" | "dice-5" | "dice-6" | "dices" | "diff" | "disc" | "disc-2" | "disc-3" | "disc-album" | "divide" | "divide-circle" | "divide-square" | "dna" | "dna-off" | "dock" | "dog" | "dollar-sign" | "donut" | "door-closed" | "door-closed-locked" | "door-open" | "dot" | "dot-square" | "download" | "download-cloud" | "drafting-compass" | "drama" | "dribbble" | "drill" | "drone" | "droplet" | "droplet-off" | "droplets" | "drum" | "drumstick" | "dumbbell" | "ear" | "ear-off" | "earth" | "earth-lock" | "eclipse" | "edit" | "edit-2" | "edit-3" | "egg" | "egg-fried" | "egg-off" | "ellipse" | "ellipsis" | "ellipsis-vertical" | "equal" | "equal-approximately" | "equal-not" | "equal-square" | "eraser" | "ethernet-port" | "euro" | "ev-charger" | "expand" | "external-link" | "eye" | "eye-closed" | "eye-off" | "facebook" | "factory" | "fan" | "fast-forward" | "feather" | "fence" | "ferris-wheel" | "figma" | "file" | "file-archive" | "file-audio" | "file-audio-2" | "file-axis-3-d" | "file-axis-3d" | "file-badge" | "file-badge-2" | "file-bar-chart" | "file-bar-chart-2" | "file-box" | "file-braces" | "file-braces-corner" | "file-chart-column" | "file-chart-column-increasing" | "file-chart-line" | "file-chart-pie" | "file-check" | "file-check-2" | "file-check-corner" | "file-clock" | "file-code" | "file-code-2" | "file-code-corner" | "file-cog" | "file-cog-2" | "file-diff" | "file-digit" | "file-down" | "file-edit" | "file-exclamation-point" | "file-headphone" | "file-heart" | "file-image" | "file-input" | "file-json" | "file-json-2" | "file-key" | "file-key-2" | "file-line-chart" | "file-lock" | "file-lock-2" | "file-minus" | "file-minus-2" | "file-minus-corner" | "file-music" | "file-output" | "file-pen" | "file-pen-line" | "file-pie-chart" | "file-play" | "file-plus" | "file-plus-2" | "file-plus-corner" | "file-question" | "file-question-mark" | "file-scan" | "file-search" | "file-search-2" | "file-search-corner" | "file-signal" | "file-signature" | "file-sliders" | "file-spreadsheet" | "file-stack" | "file-symlink" | "file-terminal" | "file-text" | "file-type" | "file-type-2" | "file-type-corner" | "file-up" | "file-user" | "file-video" | "file-video-2" | "file-video-camera" | "file-volume" | "file-volume-2" | "file-warning" | "file-x" | "file-x-2" | "file-x-corner" | "files" | "film" | "filter" | "filter-x" | "fingerprint" | "fingerprint-pattern" | "fire-extinguisher" | "fish" | "fish-off" | "fish-symbol" | "fishing-hook" | "fishing-rod" | "flag" | "flag-off" | "flag-triangle-left" | "flag-triangle-right" | "flame" | "flame-kindling" | "flashlight" | "flashlight-off" | "flask-conical" | "flask-conical-off" | "flask-round" | "flip-horizontal" | "flip-horizontal-2" | "flip-vertical" | "flip-vertical-2" | "flower" | "flower-2" | "focus" | "fold-horizontal" | "fold-vertical" | "folder" | "folder-archive" | "folder-check" | "folder-clock" | "folder-closed" | "folder-code" | "folder-cog" | "folder-cog-2" | "folder-dot" | "folder-down" | "folder-edit" | "folder-git" | "folder-git-2" | "folder-heart" | "folder-input" | "folder-kanban" | "folder-key" | "folder-lock" | "folder-minus" | "folder-open" | "folder-open-dot" | "folder-output" | "folder-pen" | "folder-plus" | "folder-root" | "folder-search" | "folder-search-2" | "folder-symlink" | "folder-sync" | "folder-tree" | "folder-up" | "folder-x" | "folders" | "footprints" | "fork-knife" | "fork-knife-crossed" | "forklift" | "form" | "form-input" | "forward" | "frame" | "framer" | "frown" | "fuel" | "fullscreen" | "function-square" | "funnel" | "funnel-plus" | "funnel-x" | "gallery-horizontal" | "gallery-horizontal-end" | "gallery-thumbnails" | "gallery-vertical" | "gallery-vertical-end" | "gamepad" | "gamepad-2" | "gamepad-directional" | "gantt-chart" | "gantt-chart-square" | "gauge" | "gauge-circle" | "gavel" | "gem" | "georgian-lari" | "ghost" | "gift" | "git-branch" | "git-branch-minus" | "git-branch-plus" | "git-commit" | "git-commit-horizontal" | "git-commit-vertical" | "git-compare" | "git-compare-arrows" | "git-fork" | "git-graph" | "git-merge" | "git-merge-conflict" | "git-pull-request" | "git-pull-request-arrow" | "git-pull-request-closed" | "git-pull-request-create" | "git-pull-request-create-arrow" | "git-pull-request-draft" | "github" | "gitlab" | "glass-water" | "glasses" | "globe" | "globe-2" | "globe-lock" | "globe-off" | "globe-x" | "goal" | "gpu" | "grab" | "graduation-cap" | "grape" | "grid" | "grid-2-x-2" | "grid-2-x-2-check" | "grid-2-x-2-plus" | "grid-2-x-2-x" | "grid-2x2" | "grid-2x2-check" | "grid-2x2-plus" | "grid-2x2-x" | "grid-3-x-3" | "grid-3x2" | "grid-3x3" | "grip" | "grip-horizontal" | "grip-vertical" | "group" | "guitar" | "ham" | "hamburger" | "hammer" | "hand" | "hand-coins" | "hand-fist" | "hand-grab" | "hand-heart" | "hand-helping" | "hand-metal" | "hand-platter" | "handbag" | "handshake" | "hard-drive" | "hard-drive-download" | "hard-drive-upload" | "hard-hat" | "hash" | "hat-glasses" | "haze" | "hd" | "hdmi-port" | "heading" | "heading-1" | "heading-2" | "heading-3" | "heading-4" | "heading-5" | "heading-6" | "headphone-off" | "headphones" | "headset" | "heart" | "heart-crack" | "heart-handshake" | "heart-minus" | "heart-off" | "heart-plus" | "heart-pulse" | "heater" | "helicopter" | "help-circle" | "helping-hand" | "hexagon" | "highlighter" | "history" | "home" | "hop" | "hop-off" | "hospital" | "hotel" | "hourglass" | "house" | "house-heart" | "house-plug" | "house-plus" | "house-wifi" | "ice-cream" | "ice-cream-2" | "ice-cream-bowl" | "ice-cream-cone" | "id-card" | "id-card-lanyard" | "image" | "image-down" | "image-minus" | "image-off" | "image-play" | "image-plus" | "image-up" | "image-upscale" | "images" | "import" | "inbox" | "indent" | "indent-decrease" | "indent-increase" | "indian-rupee" | "infinity" | "info" | "inspect" | "inspection-panel" | "instagram" | "italic" | "iteration-ccw" | "iteration-cw" | "japanese-yen" | "joystick" | "kanban" | "kanban-square" | "kanban-square-dashed" | "kayak" | "key" | "key-round" | "key-square" | "keyboard" | "keyboard-music" | "keyboard-off" | "lamp" | "lamp-ceiling" | "lamp-desk" | "lamp-floor" | "lamp-wall-down" | "lamp-wall-up" | "land-plot" | "landmark" | "languages" | "laptop" | "laptop-2" | "laptop-minimal" | "laptop-minimal-check" | "lasso" | "lasso-select" | "laugh" | "layers" | "layers-2" | "layers-3" | "layers-plus" | "layout" | "layout-dashboard" | "layout-grid" | "layout-list" | "layout-panel-left" | "layout-panel-top" | "layout-template" | "leaf" | "leafy-green" | "lectern" | "lens-concave" | "lens-convex" | "letter-text" | "library" | "library-big" | "library-square" | "life-buoy" | "ligature" | "lightbulb" | "lightbulb-off" | "line-chart" | "line-dot-right-horizontal" | "line-squiggle" | "link" | "link-2" | "link-2-off" | "linkedin" | "list" | "list-check" | "list-checks" | "list-chevrons-down-up" | "list-chevrons-up-down" | "list-collapse" | "list-end" | "list-filter" | "list-filter-plus" | "list-indent-decrease" | "list-indent-increase" | "list-minus" | "list-music" | "list-ordered" | "list-plus" | "list-restart" | "list-start" | "list-todo" | "list-tree" | "list-video" | "list-x" | "loader" | "loader-2" | "loader-circle" | "loader-pinwheel" | "locate" | "locate-fixed" | "locate-off" | "location-edit" | "lock" | "lock-keyhole" | "lock-keyhole-open" | "lock-open" | "log-in" | "log-out" | "logs" | "lollipop" | "luggage" | "m-square" | "magnet" | "mail" | "mail-check" | "mail-minus" | "mail-open" | "mail-plus" | "mail-question" | "mail-question-mark" | "mail-search" | "mail-warning" | "mail-x" | "mailbox" | "mails" | "map" | "map-minus" | "map-pin" | "map-pin-check" | "map-pin-check-inside" | "map-pin-house" | "map-pin-minus" | "map-pin-minus-inside" | "map-pin-off" | "map-pin-pen" | "map-pin-plus" | "map-pin-plus-inside" | "map-pin-x" | "map-pin-x-inside" | "map-pinned" | "map-plus" | "mars" | "mars-stroke" | "martini" | "maximize" | "maximize-2" | "medal" | "megaphone" | "megaphone-off" | "meh" | "memory-stick" | "menu" | "menu-square" | "merge" | "message-circle" | "message-circle-check" | "message-circle-code" | "message-circle-dashed" | "message-circle-heart" | "message-circle-more" | "message-circle-off" | "message-circle-plus" | "message-circle-question" | "message-circle-question-mark" | "message-circle-reply" | "message-circle-warning" | "message-circle-x" | "message-square" | "message-square-check" | "message-square-code" | "message-square-dashed" | "message-square-diff" | "message-square-dot" | "message-square-heart" | "message-square-lock" | "message-square-more" | "message-square-off" | "message-square-plus" | "message-square-quote" | "message-square-reply" | "message-square-share" | "message-square-text" | "message-square-warning" | "message-square-x" | "messages-square" | "metronome" | "mic" | "mic-2" | "mic-off" | "mic-vocal" | "microchip" | "microscope" | "microwave" | "milestone" | "milk" | "milk-off" | "minimize" | "minimize-2" | "minus" | "minus-circle" | "minus-square" | "mirror-rectangular" | "mirror-round" | "monitor" | "monitor-check" | "monitor-cloud" | "monitor-cog" | "monitor-dot" | "monitor-down" | "monitor-off" | "monitor-pause" | "monitor-play" | "monitor-smartphone" | "monitor-speaker" | "monitor-stop" | "monitor-up" | "monitor-x" | "moon" | "moon-star" | "more-horizontal" | "more-vertical" | "motorbike" | "mountain" | "mountain-snow" | "mouse" | "mouse-left" | "mouse-off" | "mouse-pointer" | "mouse-pointer-2" | "mouse-pointer-2-off" | "mouse-pointer-ban" | "mouse-pointer-click" | "mouse-pointer-square-dashed" | "mouse-right" | "move" | "move-3-d" | "move-3d" | "move-diagonal" | "move-diagonal-2" | "move-down" | "move-down-left" | "move-down-right" | "move-horizontal" | "move-left" | "move-right" | "move-up" | "move-up-left" | "move-up-right" | "move-vertical" | "music" | "music-2" | "music-3" | "music-4" | "navigation" | "navigation-2" | "navigation-2-off" | "navigation-off" | "network" | "newspaper" | "nfc" | "non-binary" | "notebook" | "notebook-pen" | "notebook-tabs" | "notebook-text" | "notepad-text" | "notepad-text-dashed" | "nut" | "nut-off" | "octagon" | "octagon-alert" | "octagon-minus" | "octagon-pause" | "octagon-x" | "omega" | "option" | "orbit" | "origami" | "outdent" | "package" | "package-2" | "package-check" | "package-minus" | "package-open" | "package-plus" | "package-search" | "package-x" | "paint-bucket" | "paint-roller" | "paintbrush" | "paintbrush-2" | "paintbrush-vertical" | "palette" | "palmtree" | "panda" | "panel-bottom" | "panel-bottom-close" | "panel-bottom-dashed" | "panel-bottom-inactive" | "panel-bottom-open" | "panel-left" | "panel-left-close" | "panel-left-dashed" | "panel-left-inactive" | "panel-left-open" | "panel-left-right-dashed" | "panel-right" | "panel-right-close" | "panel-right-dashed" | "panel-right-inactive" | "panel-right-open" | "panel-top" | "panel-top-bottom-dashed" | "panel-top-close" | "panel-top-dashed" | "panel-top-inactive" | "panel-top-open" | "panels-left-bottom" | "panels-left-right" | "panels-right-bottom" | "panels-top-bottom" | "panels-top-left" | "paperclip" | "parentheses" | "parking-circle" | "parking-circle-off" | "parking-meter" | "parking-square" | "parking-square-off" | "party-popper" | "pause" | "pause-circle" | "pause-octagon" | "paw-print" | "pc-case" | "pen" | "pen-box" | "pen-line" | "pen-off" | "pen-square" | "pen-tool" | "pencil" | "pencil-line" | "pencil-off" | "pencil-ruler" | "pentagon" | "percent" | "percent-circle" | "percent-diamond" | "percent-square" | "person-standing" | "philippine-peso" | "phone" | "phone-call" | "phone-forwarded" | "phone-incoming" | "phone-missed" | "phone-off" | "phone-outgoing" | "pi" | "pi-square" | "piano" | "pickaxe" | "picture-in-picture" | "picture-in-picture-2" | "pie-chart" | "piggy-bank" | "pilcrow" | "pilcrow-left" | "pilcrow-right" | "pilcrow-square" | "pill" | "pill-bottle" | "pin" | "pin-off" | "pipette" | "pizza" | "plane" | "plane-landing" | "plane-takeoff" | "play" | "play-circle" | "play-square" | "plug" | "plug-2" | "plug-zap" | "plug-zap-2" | "plus" | "plus-circle" | "plus-square" | "pocket" | "pocket-knife" | "podcast" | "pointer" | "pointer-off" | "popcorn" | "popsicle" | "pound-sterling" | "power" | "power-circle" | "power-off" | "power-square" | "presentation" | "printer" | "printer-check" | "printer-x" | "projector" | "proportions" | "puzzle" | "pyramid" | "qr-code" | "quote" | "rabbit" | "radar" | "radiation" | "radical" | "radio" | "radio-receiver" | "radio-tower" | "radius" | "rail-symbol" | "rainbow" | "rat" | "ratio" | "receipt" | "receipt-cent" | "receipt-euro" | "receipt-indian-rupee" | "receipt-japanese-yen" | "receipt-pound-sterling" | "receipt-russian-ruble" | "receipt-swiss-franc" | "receipt-text" | "receipt-turkish-lira" | "rectangle-circle" | "rectangle-ellipsis" | "rectangle-goggles" | "rectangle-horizontal" | "rectangle-vertical" | "recycle" | "redo" | "redo-2" | "redo-dot" | "refresh-ccw" | "refresh-ccw-dot" | "refresh-cw" | "refresh-cw-off" | "refrigerator" | "regex" | "remove-formatting" | "repeat" | "repeat-1" | "repeat-2" | "replace" | "replace-all" | "reply" | "reply-all" | "rewind" | "ribbon" | "rocket" | "rocking-chair" | "roller-coaster" | "rose" | "rotate-3-d" | "rotate-3d" | "rotate-ccw" | "rotate-ccw-key" | "rotate-ccw-square" | "rotate-cw" | "rotate-cw-square" | "route" | "route-off" | "router" | "rows" | "rows-2" | "rows-3" | "rows-4" | "rss" | "ruler" | "ruler-dimension-line" | "russian-ruble" | "sailboat" | "salad" | "sandwich" | "satellite" | "satellite-dish" | "saudi-riyal" | "save" | "save-all" | "save-off" | "scale" | "scale-3-d" | "scale-3d" | "scaling" | "scan" | "scan-barcode" | "scan-eye" | "scan-face" | "scan-heart" | "scan-line" | "scan-qr-code" | "scan-search" | "scan-text" | "scatter-chart" | "school" | "school-2" | "scissors" | "scissors-line-dashed" | "scissors-square" | "scissors-square-dashed-bottom" | "scooter" | "screen-share" | "screen-share-off" | "scroll" | "scroll-text" | "search" | "search-alert" | "search-check" | "search-code" | "search-slash" | "search-x" | "section" | "send" | "send-horizonal" | "send-horizontal" | "send-to-back" | "separator-horizontal" | "separator-vertical" | "server" | "server-cog" | "server-crash" | "server-off" | "settings" | "settings-2" | "shapes" | "share" | "share-2" | "sheet" | "shell" | "shelving-unit" | "shield" | "shield-alert" | "shield-ban" | "shield-check" | "shield-close" | "shield-ellipsis" | "shield-half" | "shield-minus" | "shield-off" | "shield-plus" | "shield-question" | "shield-question-mark" | "shield-user" | "shield-x" | "ship" | "ship-wheel" | "shirt" | "shopping-bag" | "shopping-basket" | "shopping-cart" | "shovel" | "shower-head" | "shredder" | "shrimp" | "shrink" | "shrub" | "shuffle" | "sidebar" | "sidebar-close" | "sidebar-open" | "sigma" | "sigma-square" | "signal" | "signal-high" | "signal-low" | "signal-medium" | "signal-zero" | "signature" | "signpost" | "signpost-big" | "siren" | "skip-back" | "skip-forward" | "skull" | "slack" | "slash" | "slash-square" | "slice" | "sliders" | "sliders-horizontal" | "sliders-vertical" | "smartphone" | "smartphone-charging" | "smartphone-nfc" | "smile" | "smile-plus" | "snail" | "snowflake" | "soap-dispenser-droplet" | "sofa" | "solar-panel" | "sort-asc" | "sort-desc" | "soup" | "space" | "spade" | "sparkle" | "sparkles" | "speaker" | "speech" | "spell-check" | "spell-check-2" | "spline" | "spline-pointer" | "split" | "split-square-horizontal" | "split-square-vertical" | "spool" | "spotlight" | "spray-can" | "sprout" | "square" | "square-activity" | "square-arrow-down" | "square-arrow-down-left" | "square-arrow-down-right" | "square-arrow-left" | "square-arrow-out-down-left" | "square-arrow-out-down-right" | "square-arrow-out-up-left" | "square-arrow-out-up-right" | "square-arrow-right" | "square-arrow-right-enter" | "square-arrow-right-exit" | "square-arrow-up" | "square-arrow-up-left" | "square-arrow-up-right" | "square-asterisk" | "square-bottom-dashed-scissors" | "square-centerline-dashed-horizontal" | "square-centerline-dashed-vertical" | "square-chart-gantt" | "square-check" | "square-check-big" | "square-chevron-down" | "square-chevron-left" | "square-chevron-right" | "square-chevron-up" | "square-code" | "square-dashed" | "square-dashed-bottom" | "square-dashed-bottom-code" | "square-dashed-kanban" | "square-dashed-mouse-pointer" | "square-dashed-top-solid" | "square-divide" | "square-dot" | "square-equal" | "square-function" | "square-gantt-chart" | "square-kanban" | "square-library" | "square-m" | "square-menu" | "square-minus" | "square-mouse-pointer" | "square-parking" | "square-parking-off" | "square-pause" | "square-pen" | "square-percent" | "square-pi" | "square-pilcrow" | "square-play" | "square-plus" | "square-power" | "square-radical" | "square-round-corner" | "square-scissors" | "square-sigma" | "square-slash" | "square-split-horizontal" | "square-split-vertical" | "square-square" | "square-stack" | "square-star" | "square-stop" | "square-terminal" | "square-user" | "square-user-round" | "square-x" | "squares-exclude" | "squares-intersect" | "squares-subtract" | "squares-unite" | "squircle" | "squircle-dashed" | "squirrel" | "stamp" | "star" | "star-half" | "star-off" | "stars" | "step-back" | "step-forward" | "stethoscope" | "sticker" | "sticky-note" | "stone" | "stop-circle" | "store" | "stretch-horizontal" | "stretch-vertical" | "strikethrough" | "subscript" | "subtitles" | "sun" | "sun-dim" | "sun-medium" | "sun-moon" | "sun-snow" | "sunrise" | "sunset" | "superscript" | "swatch-book" | "swiss-franc" | "switch-camera" | "sword" | "swords" | "syringe" | "table" | "table-2" | "table-cells-merge" | "table-cells-split" | "table-columns-split" | "table-config" | "table-of-contents" | "table-properties" | "table-rows-split" | "tablet" | "tablet-smartphone" | "tablets" | "tag" | "tags" | "tally-1" | "tally-2" | "tally-3" | "tally-4" | "tally-5" | "tangent" | "target" | "telescope" | "tent" | "tent-tree" | "terminal" | "terminal-square" | "test-tube" | "test-tube-2" | "test-tube-diagonal" | "test-tubes" | "text" | "text-align-center" | "text-align-end" | "text-align-justify" | "text-align-start" | "text-cursor" | "text-cursor-input" | "text-initial" | "text-quote" | "text-search" | "text-select" | "text-selection" | "text-wrap" | "theater" | "thermometer" | "thermometer-snowflake" | "thermometer-sun" | "thumbs-down" | "thumbs-up" | "ticket" | "ticket-check" | "ticket-minus" | "ticket-percent" | "ticket-plus" | "ticket-slash" | "ticket-x" | "tickets" | "tickets-plane" | "timer" | "timer-off" | "timer-reset" | "toggle-left" | "toggle-right" | "toilet" | "tool-case" | "toolbox" | "tornado" | "torus" | "touchpad" | "touchpad-off" | "towel-rack" | "tower-control" | "toy-brick" | "tractor" | "traffic-cone" | "train" | "train-front" | "train-front-tunnel" | "train-track" | "tram-front" | "transgender" | "trash" | "trash-2" | "tree-deciduous" | "tree-palm" | "tree-pine" | "trees" | "trello" | "trending-down" | "trending-up" | "trending-up-down" | "triangle" | "triangle-alert" | "triangle-dashed" | "triangle-right" | "trophy" | "truck" | "truck-electric" | "turkish-lira" | "turntable" | "turtle" | "tv" | "tv-2" | "tv-minimal" | "tv-minimal-play" | "twitch" | "twitter" | "type" | "type-outline" | "umbrella" | "umbrella-off" | "underline" | "undo" | "undo-2" | "undo-dot" | "unfold-horizontal" | "unfold-vertical" | "ungroup" | "university" | "unlink" | "unlink-2" | "unlock" | "unlock-keyhole" | "unplug" | "upload" | "upload-cloud" | "usb" | "user" | "user-2" | "user-check" | "user-check-2" | "user-circle" | "user-circle-2" | "user-cog" | "user-cog-2" | "user-key" | "user-lock" | "user-minus" | "user-minus-2" | "user-pen" | "user-plus" | "user-plus-2" | "user-round" | "user-round-check" | "user-round-cog" | "user-round-key" | "user-round-minus" | "user-round-pen" | "user-round-plus" | "user-round-search" | "user-round-x" | "user-search" | "user-square" | "user-square-2" | "user-star" | "user-x" | "user-x-2" | "users" | "users-2" | "users-round" | "utensils" | "utensils-crossed" | "utility-pole" | "van" | "variable" | "vault" | "vector-square" | "vegan" | "venetian-mask" | "venus" | "venus-and-mars" | "verified" | "vibrate" | "vibrate-off" | "video" | "video-off" | "videotape" | "view" | "voicemail" | "volleyball" | "volume" | "volume-1" | "volume-2" | "volume-off" | "volume-x" | "vote" | "wallet" | "wallet-2" | "wallet-cards" | "wallet-minimal" | "wallpaper" | "wand" | "wand-2" | "wand-sparkles" | "warehouse" | "washing-machine" | "watch" | "waves" | "waves-arrow-down" | "waves-arrow-up" | "waves-ladder" | "waypoints" | "webcam" | "webhook" | "webhook-off" | "weight" | "weight-tilde" | "wheat" | "wheat-off" | "whole-word" | "wifi" | "wifi-cog" | "wifi-high" | "wifi-low" | "wifi-off" | "wifi-pen" | "wifi-sync" | "wifi-zero" | "wind" | "wind-arrow-down" | "wine" | "wine-off" | "workflow" | "worm" | "wrap-text" | "wrench" | "x" | "x-circle" | "x-line-top" | "x-octagon" | "x-square" | "youtube" | "zap" | "zap-off" | "zodiac-aquarius" | "zodiac-aries" | "zodiac-cancer" | "zodiac-capricorn" | "zodiac-gemini" | "zodiac-leo" | "zodiac-libra" | "zodiac-ophiuchus" | "zodiac-pisces" | "zodiac-sagittarius" | "zodiac-scorpio" | "zodiac-taurus" | "zodiac-virgo" | "zoom-in" | "zoom-out")
2
- export type _Schema3 = ("start" | "center" | "end")
3
- export type _Schema4 = ((string | {
2
+ export type _Schema2 = (("auth" | "anon" | "always" | "hide") | unknown)
3
+ export type _Schema4 = ("start" | "center" | "end")
4
+ export type _Schema5 = ((string | {
4
5
  type: "doc"
5
6
  file: string
6
7
  path?: string
7
- icon?: _Schema5
8
+ icon?: _Schema6
8
9
  label?: string
9
- badge?: _Schema6
10
- display?: _Schema7
10
+ badge?: _Schema7
11
+ display?: _Schema2
11
12
  }) | {
12
13
  type: "link"
13
14
  to: string
14
15
  label: string
15
16
  target?: ("_self" | "_blank")
16
- icon?: _Schema5
17
- badge?: _Schema6
18
- display?: _Schema7
17
+ icon?: _Schema6
18
+ badge?: _Schema7
19
+ display?: _Schema2
19
20
  } | {
20
21
  type: "custom-page"
21
22
  path: string
22
23
  label?: string
23
24
  element: unknown
24
- icon?: _Schema5
25
- badge?: _Schema6
26
- display?: _Schema7
25
+ icon?: _Schema6
26
+ badge?: _Schema7
27
+ display?: _Schema2
27
28
  layout?: ("default" | "none")
28
29
  } | {
29
30
  type: "separator"
30
- display?: _Schema7
31
+ display?: _Schema2
31
32
  } | {
32
33
  type: "section"
33
34
  label: string
34
- display?: _Schema7
35
+ display?: _Schema2
35
36
  } | {
36
37
  type: "filter"
37
38
  placeholder?: string
38
- display?: _Schema7
39
+ display?: _Schema2
39
40
  } | {
40
41
  type: "category"
41
- icon?: _Schema5
42
+ icon?: _Schema6
42
43
  label: string
43
44
  collapsible?: boolean
44
45
  collapsed?: boolean
@@ -48,11 +49,10 @@ export type _Schema4 = ((string | {
48
49
  label?: string
49
50
  path?: string
50
51
  })
51
- display?: _Schema7
52
- items: _Schema4[]
52
+ display?: _Schema2
53
+ items: _Schema5[]
53
54
  })
54
- export type _Schema5 = unknown
55
- export type _Schema7 = (("auth" | "anon" | "always" | "hide") | unknown)
55
+ export type _Schema6 = unknown
56
56
  export type _Schema9 = (("Inter" | "Roboto" | "Open Sans" | "Poppins" | "Montserrat" | "Outfit" | "Plus Jakarta Sans" | "DM Sans" | "IBM Plex Sans" | "Geist" | "Oxanium" | "Architects Daughter" | "Merriweather" | "Playfair Display" | "Lora" | "Source Serif Pro" | "Libre Baskerville" | "Space Grotesk" | "JetBrains Mono" | "Fira Code" | "Source Code Pro" | "IBM Plex Mono" | "Roboto Mono" | "Space Mono" | "Geist Mono") | {
57
57
  url: string
58
58
  fontFamily?: string
@@ -158,36 +158,37 @@ export interface FlatZudokuConfig {
158
158
  icon?: _Schema1
159
159
  to: string
160
160
  target?: ("_self" | "_blank")
161
+ display?: _Schema2
161
162
  } | {
162
163
  label: string
163
- items: (_Schema2 | {
164
+ items: (_Schema3 | {
164
165
  label: string
165
- items: _Schema2[]
166
+ items: _Schema3[]
166
167
  })[]
167
168
  })[]
168
169
  placements?: {
169
- navigation?: _Schema3
170
- search?: _Schema3
170
+ navigation?: _Schema4
171
+ search?: _Schema4
171
172
  auth?: ("start" | "center" | "end" | "navigation")
172
173
  }
173
174
  }
174
- navigation?: _Schema4[]
175
+ navigation?: _Schema5[]
175
176
  navigationRules?: ({
176
177
  type: "modify"
177
178
  match: string
178
179
  set: {
179
180
  label?: string
180
- icon?: _Schema5
181
- badge?: _Schema6
181
+ icon?: _Schema6
182
+ badge?: _Schema7
182
183
  collapsed?: boolean
183
184
  collapsible?: boolean
184
- display?: _Schema7
185
+ display?: _Schema2
185
186
  }
186
187
  } | {
187
188
  type: "insert"
188
189
  match: string
189
190
  position: ("before" | "after")
190
- items: _Schema4[]
191
+ items: _Schema5[]
191
192
  } | {
192
193
  type: "remove"
193
194
  match: string
@@ -412,14 +413,15 @@ export interface _Schema0 {
412
413
  href?: string
413
414
  reloadDocument?: boolean
414
415
  }
415
- export interface _Schema2 {
416
+ export interface _Schema3 {
416
417
  label: string
417
418
  icon?: _Schema1
418
419
  description?: string
419
420
  to: string
420
421
  target?: ("_self" | "_blank")
422
+ display?: _Schema2
421
423
  }
422
- export interface _Schema6 {
424
+ export interface _Schema7 {
423
425
  label: string
424
426
  color: ("green" | "blue" | "yellow" | "red" | "purple" | "indigo" | "gray" | "outline")
425
427
  invert?: boolean
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lukoweb/apitogo",
3
- "version": "0.1.39",
3
+ "version": "0.1.40",
4
4
  "type": "module",
5
5
  "sideEffects": [
6
6
  "**/*.css",
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { IconNames } from "./icon-types.js";
3
+ import { DisplaySchema } from "./InputNavigationSchema.js";
3
4
 
4
5
  const IconSchema = z.enum(IconNames);
5
6
 
@@ -9,6 +10,7 @@ const HeaderNavLinkItemSchema = z.object({
9
10
  description: z.string().optional(),
10
11
  to: z.string(),
11
12
  target: z.enum(["_self", "_blank"]).optional(),
13
+ display: DisplaySchema,
12
14
  });
13
15
 
14
16
  const HeaderNavGroupSchema = z.object({
@@ -22,6 +24,7 @@ const HeaderNavItemSchema = z.union([
22
24
  icon: IconSchema.optional(),
23
25
  to: z.string(),
24
26
  target: z.enum(["_self", "_blank"]).optional(),
27
+ display: DisplaySchema,
25
28
  }),
26
29
  z.object({
27
30
  label: z.string(),
@@ -7,6 +7,8 @@ export type DevPortalAuthMode = "live" | "preview";
7
7
  export type EndUserMeResponse = {
8
8
  userId: string;
9
9
  displayName: string | null;
10
+ email?: string | null;
11
+ emailVerified?: boolean | null;
10
12
  subscriptions: Array<{
11
13
  planSku: string;
12
14
  status: string;
@@ -94,13 +94,50 @@ export async function probeDevPortalBackend(
94
94
  }
95
95
  }
96
96
 
97
+ function readOptionalString(...values: unknown[]): string | undefined {
98
+ for (const value of values) {
99
+ if (typeof value === "string" && value.trim()) {
100
+ return value.trim();
101
+ }
102
+ }
103
+
104
+ return undefined;
105
+ }
106
+
107
+ function readOptionalBoolean(...values: unknown[]): boolean | undefined {
108
+ for (const value of values) {
109
+ if (typeof value === "boolean") {
110
+ return value;
111
+ }
112
+
113
+ if (value === "true" || value === "True") {
114
+ return true;
115
+ }
116
+
117
+ if (value === "false" || value === "False") {
118
+ return false;
119
+ }
120
+ }
121
+
122
+ return undefined;
123
+ }
124
+
97
125
  export function mapEndUserMeToProfile(
98
126
  me: EndUserMeResponse,
99
127
  ): import("../state.js").UserProfile {
128
+ const raw = me as EndUserMeResponse & Record<string, unknown>;
129
+ const email = readOptionalString(raw.email, raw.Email, raw.emailAddress);
130
+ const emailVerified =
131
+ readOptionalBoolean(
132
+ raw.emailVerified,
133
+ raw.EmailVerified,
134
+ raw.email_verified,
135
+ ) ?? (email != null ? true : false);
136
+
100
137
  return {
101
138
  sub: me.userId,
102
- email: undefined,
103
- emailVerified: false,
139
+ email,
140
+ emailVerified,
104
141
  name: me.displayName ?? undefined,
105
142
  pictureUrl: undefined,
106
143
  };
@@ -45,7 +45,6 @@ export class DevPortalAuthenticationProvider
45
45
  private readonly redirectToAfterSignIn: string | undefined;
46
46
  private readonly redirectToAfterSignUp: string | undefined;
47
47
  private readonly redirectToAfterSignOut: string;
48
- private authMode: DevPortalAuthMode = "preview";
49
48
  private backendAvailable = false;
50
49
  private refreshGeneration = 0;
51
50
  private refreshInFlight: Promise<boolean> | null = null;
@@ -97,12 +96,10 @@ export class DevPortalAuthenticationProvider
97
96
  private async syncBackendAvailability(): Promise<void> {
98
97
  if (!this.apiBaseUrl || isPlaceholderDevPortalApiUrl(this.apiBaseUrl)) {
99
98
  this.backendAvailable = false;
100
- this.authMode = "preview";
101
99
  return;
102
100
  }
103
101
 
104
102
  this.backendAvailable = await probeDevPortalBackend(this.apiBaseUrl);
105
- this.authMode = this.backendAvailable ? "live" : "preview";
106
103
  }
107
104
 
108
105
  private setPreviewState(): void {
@@ -122,8 +119,8 @@ export class DevPortalAuthenticationProvider
122
119
  });
123
120
  }
124
121
 
125
- private ensureLiveBackend(): string {
126
- if (!this.apiBaseUrl || !this.backendAvailable) {
122
+ private ensureConfiguredBackend(): string {
123
+ if (!this.apiBaseUrl || isPlaceholderDevPortalApiUrl(this.apiBaseUrl)) {
127
124
  throw new Error("Dev portal authentication is not available in preview.");
128
125
  }
129
126
 
@@ -235,7 +232,7 @@ export class DevPortalAuthenticationProvider
235
232
  _: AuthActionContext,
236
233
  { redirectTo }: AuthActionOptions = {},
237
234
  ): Promise<void> {
238
- const apiBaseUrl = this.ensureLiveBackend();
235
+ const apiBaseUrl = this.ensureConfiguredBackend();
239
236
  const target =
240
237
  redirectTo ?? this.redirectToAfterSignIn ?? window.location.href;
241
238
  window.location.assign(buildDevPortalLoginUrl(apiBaseUrl, target));
@@ -245,14 +242,14 @@ export class DevPortalAuthenticationProvider
245
242
  _: AuthActionContext,
246
243
  { redirectTo }: AuthActionOptions = {},
247
244
  ): Promise<void> {
248
- const apiBaseUrl = this.ensureLiveBackend();
245
+ const apiBaseUrl = this.ensureConfiguredBackend();
249
246
  const target =
250
247
  redirectTo ?? this.redirectToAfterSignUp ?? window.location.href;
251
248
  window.location.assign(buildDevPortalLoginUrl(apiBaseUrl, target));
252
249
  }
253
250
 
254
251
  async signOut(_: AuthActionContext): Promise<void> {
255
- const apiBaseUrl = this.ensureLiveBackend();
252
+ const apiBaseUrl = this.ensureConfiguredBackend();
256
253
  window.location.assign(
257
254
  buildDevPortalLogoutUrl(apiBaseUrl, this.redirectToAfterSignOut),
258
255
  );
@@ -73,15 +73,9 @@ const ProfileMenu = () => {
73
73
  const context = useZudoku();
74
74
  const profileItems = context.getProfileMenuItems();
75
75
  const auth = useAuth();
76
- const {
77
- isAuthEnabled,
78
- isAuthenticated,
79
- isPending,
80
- profile,
81
- isBackendAvailable,
82
- } = auth;
76
+ const { isAuthEnabled, isAuthenticated, isPending, profile } = auth;
83
77
 
84
- if (!isAuthEnabled || !isBackendAvailable) return null;
78
+ if (!isAuthEnabled) return null;
85
79
 
86
80
  return (
87
81
  <ClientOnly fallback={<Skeleton className="rounded-sm h-5 w-24 mr-4" />}>
@@ -6,6 +6,9 @@ import {
6
6
  type HeaderNavItem,
7
7
  type HeaderNavLinkItem,
8
8
  } from "../../config/validators/HeaderNavigationSchema.js";
9
+ import { useAuth } from "../authentication/hook.js";
10
+ import { shouldShowItem } from "./navigation/utils.js";
11
+ import type { ZudokuContext } from "../core/ZudokuContext.js";
9
12
  import {
10
13
  NavigationMenu,
11
14
  NavigationMenuContent,
@@ -87,7 +90,25 @@ const DropdownContent = ({
87
90
  );
88
91
  };
89
92
 
90
- const HeaderNavItemComponent = ({ item }: { item: HeaderNavItem }) => {
93
+ const HeaderNavItemComponent = ({
94
+ item,
95
+ auth,
96
+ context,
97
+ }: {
98
+ item: HeaderNavItem;
99
+ auth: ReturnType<typeof useAuth>;
100
+ context: ZudokuContext;
101
+ }) => {
102
+ if ("to" in item) {
103
+ const show = shouldShowItem({ auth, context })({
104
+ type: "link",
105
+ label: item.label,
106
+ to: item.to,
107
+ display: item.display,
108
+ });
109
+ if (!show) return null;
110
+ }
111
+
91
112
  if ("to" in item) {
92
113
  const Icon = item.icon as LucideIcon | undefined;
93
114
  return (
@@ -123,9 +144,10 @@ const HeaderNavItemComponent = ({ item }: { item: HeaderNavItem }) => {
123
144
  };
124
145
 
125
146
  export const HeaderNavigation = () => {
126
- const { options } = useZudoku();
127
- const items = options.header?.navigation;
128
- const navPosition = options.header?.placements?.navigation ?? "end";
147
+ const context = useZudoku();
148
+ const auth = useAuth();
149
+ const items = context.options.header?.navigation;
150
+ const navPosition = context.options.header?.placements?.navigation ?? "end";
129
151
  if (!items || items.length === 0) return null;
130
152
 
131
153
  const viewportAlign =
@@ -140,7 +162,12 @@ export const HeaderNavigation = () => {
140
162
  <NavigationMenuList>
141
163
  {items.map((item, index) => (
142
164
  // biome-ignore lint/suspicious/noArrayIndexKey: Stable because it's statically defined in the config
143
- <HeaderNavItemComponent key={`${item.label}-${index}`} item={item} />
165
+ <HeaderNavItemComponent
166
+ key={`${item.label}-${index}`}
167
+ item={item}
168
+ auth={auth}
169
+ context={context}
170
+ />
144
171
  ))}
145
172
  </NavigationMenuList>
146
173
  </NavigationMenu>
@@ -130,13 +130,7 @@ export const MobileTopNavigation = () => {
130
130
  getProfileMenuItems,
131
131
  } = context;
132
132
  const headerNavigation = header?.navigation ?? [];
133
- const {
134
- isAuthenticated,
135
- profile,
136
- isAuthEnabled,
137
- isBackendAvailable,
138
- isPending,
139
- } = authState;
133
+ const { isAuthenticated, profile, isAuthEnabled, isPending } = authState;
140
134
  const [drawerOpen, setDrawerOpen] = useState(false);
141
135
 
142
136
  const accountItems = getProfileMenuItems();
@@ -238,7 +232,7 @@ export const MobileTopNavigation = () => {
238
232
  </div>
239
233
  <div className="border-t shadow-[0_-4px_6px_-1px_rgba(0,0,0,0.05)] px-4 pt-3 flex flex-col gap-2">
240
234
  <div className="flex items-center justify-between">
241
- {isAuthEnabled && isBackendAvailable && (
235
+ {isAuthEnabled && (
242
236
  <ClientOnly
243
237
  fallback={<Skeleton className="rounded-sm h-8 w-16" />}
244
238
  >
@@ -172,9 +172,7 @@ export const RouteGuard = () => {
172
172
  ? blocker.location.pathname + blocker.location.search
173
173
  : location.pathname + location.search;
174
174
  const showDialog =
175
- auth.isBackendAvailable &&
176
- needsAuth &&
177
- auth.hasDistinctSignUpFlow;
175
+ auth.isBackendAvailable && needsAuth && auth.hasDistinctSignUpFlow;
178
176
  const unifiedRedirectKeyRef = useRef<string | null>(null);
179
177
 
180
178
  useEffect(() => {
@@ -198,6 +196,7 @@ export const RouteGuard = () => {
198
196
  auth.isBackendAvailable,
199
197
  auth.isPending,
200
198
  auth.hasDistinctSignUpFlow,
199
+ auth.login,
201
200
  needsAuth,
202
201
  redirectTo,
203
202
  ]);