@nice2dev/ui 1.0.12 → 1.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +53 -36
  3. package/css/legacy-bg-text-aliases.css +83 -0
  4. package/dist/NiceErrorBoundary-BLTq8mPU.cjs +1 -0
  5. package/dist/NiceErrorBoundary-Bjw5U31n.js +762 -0
  6. package/dist/NiceErrorBoundary-CH8SBcSZ.js +762 -0
  7. package/dist/NiceErrorBoundary-CaVVPLh4.cjs +1 -0
  8. package/dist/NiceForm-CUlhtlHw.js +5357 -0
  9. package/dist/NiceForm-DTgIGX88.cjs +382 -0
  10. package/dist/NiceForm-Dbciuo4w.cjs +382 -0
  11. package/dist/NiceForm-Jf-ufPZz.js +5357 -0
  12. package/dist/NiceForm.css +1 -1
  13. package/dist/NiceModal-Bf1Q1VNL.cjs +1 -0
  14. package/dist/NiceModal-C_t2qqZd.js +95 -0
  15. package/dist/NiceModal-DrywdSv3.js +95 -0
  16. package/dist/NiceModal-FQqBxCij.cjs +1 -0
  17. package/dist/NiceModuleLifecyclePanel-CCFHxKIu.js +6343 -0
  18. package/dist/NiceModuleLifecyclePanel-CDX38sEx.js +6343 -0
  19. package/dist/NiceModuleLifecyclePanel-D8cIOI8I.cjs +1 -0
  20. package/dist/NiceModuleLifecyclePanel-xLrOv8nL.cjs +1 -0
  21. package/dist/NiceModuleLifecyclePanel.css +1 -1
  22. package/dist/NicePagination-Aj63sKV3.js +171 -0
  23. package/dist/NicePagination-BVkkePJU.js +171 -0
  24. package/dist/NicePagination-DGd3Hrh9.cjs +1 -0
  25. package/dist/NicePagination-DNjVutBJ.cjs +1 -0
  26. package/dist/NicePinCodeInput-B_0RCKQN.cjs +419 -0
  27. package/dist/NicePinCodeInput-CDtodnIM.js +11875 -0
  28. package/dist/NicePinCodeInput-Dffu701_.js +11875 -0
  29. package/dist/NicePinCodeInput-DytLfqZL.cjs +419 -0
  30. package/dist/NicePinCodeInput.css +1 -1
  31. package/dist/NiceSavedQueryPanel-4l-V9dGK.js +6446 -0
  32. package/dist/NiceSavedQueryPanel-B5TjD_Sb.cjs +596 -0
  33. package/dist/NiceSavedQueryPanel-CbR3EDQU.cjs +596 -0
  34. package/dist/NiceSavedQueryPanel-DJqCNWYZ.js +6446 -0
  35. package/dist/NiceTabs-B-9_mzpc.js +1624 -0
  36. package/dist/NiceTabs-CHg36waF.cjs +1 -0
  37. package/dist/NiceTabs-CbKhMxbC.cjs +1 -0
  38. package/dist/NiceTabs-HXphGn1B.js +1624 -0
  39. package/dist/NiceWindow-BxGVzUs2.js +1409 -0
  40. package/dist/NiceWindow-Ceb0mZ_0.js +1409 -0
  41. package/dist/NiceWindow-DXpnFZ0E.cjs +1 -0
  42. package/dist/NiceWindow-HhPIzPzs.cjs +1 -0
  43. package/dist/charts-BPJefcE8.js +4645 -0
  44. package/dist/charts-Dr6QyMiv.cjs +761 -0
  45. package/dist/charts-Us8Ep8MJ.cjs +761 -0
  46. package/dist/charts-fO6InNZd.js +4645 -0
  47. package/dist/charts.cjs +1 -1
  48. package/dist/charts.mjs +1 -1
  49. package/dist/core-B-tu8l9M.cjs +96 -0
  50. package/dist/core-BJ_UNMlX.js +22276 -0
  51. package/dist/core-DJ4NPp2B.js +22316 -0
  52. package/dist/core-DPY4m7vb.cjs +96 -0
  53. package/dist/data.cjs +1 -1
  54. package/dist/data.d.ts +7 -0
  55. package/dist/data.mjs +1 -1
  56. package/dist/editors.cjs +1 -1
  57. package/dist/editors.mjs +3 -3
  58. package/dist/feedback.cjs +1 -1
  59. package/dist/feedback.mjs +2 -2
  60. package/dist/index-B-9lbtwJ.cjs +5194 -0
  61. package/dist/index-BNy9Nn0X.js +61422 -0
  62. package/dist/index-DHc_KZkF.js +61311 -0
  63. package/dist/index-drIVMHeC.cjs +5194 -0
  64. package/dist/index.cjs +1 -1
  65. package/dist/index.css +1 -1
  66. package/dist/index.d.ts +1209 -67
  67. package/dist/index.mjs +887 -871
  68. package/dist/lazy.cjs +1 -1
  69. package/dist/lazy.mjs +3 -3
  70. package/dist/navigation.cjs +1 -1
  71. package/dist/navigation.d.ts +309 -70
  72. package/dist/navigation.mjs +92 -91
  73. package/dist/overlays.cjs +1 -1
  74. package/dist/overlays.mjs +36 -36
  75. package/dist/style.css +7 -0
  76. package/package.json +9 -5
package/dist/index.d.ts CHANGED
@@ -2734,6 +2734,9 @@ export { createCustomDataSource }
2734
2734
  */
2735
2735
  export declare function createDocIndex(docs: ComponentDoc[], packageName: string): DocIndex;
2736
2736
 
2737
+ /** Build an empty recipe scaffold (used by NiceRecipeEditor "new" mode). */
2738
+ export declare function createEmptyRecipe(partial?: Partial<NiceRecipeModel>): NiceRecipeModel;
2739
+
2737
2740
  export { createGraphQLDataSource }
2738
2741
 
2739
2742
  export { createGraphQLSubscriptionSource }
@@ -6700,6 +6703,9 @@ export declare type NetworkNodeCategory = 'router' | 'switch' | 'access-point' |
6700
6703
 
6701
6704
  export declare type NetworkNodeStatus = 'online' | 'offline' | 'warning';
6702
6705
 
6706
+ /** Tiny non-cryptographic id generator suitable for UI-only records. */
6707
+ export declare function newRecipeId(prefix?: string): string;
6708
+
6703
6709
  export { NICE_BREAKPOINTS }
6704
6710
 
6705
6711
  export { NICE_BUILTIN_ICONS }
@@ -6723,6 +6729,23 @@ export { NICE_THEME_PACK_LIST_EXTENDED }
6723
6729
 
6724
6730
  export { NICE_THEME_PACKS }
6725
6731
 
6732
+ /**
6733
+ * Pre-built picker options for every preset in {@link NICE_THEME_PRESETS}.
6734
+ * Use as the default `themes` prop on `<NiceThemePicker>`.
6735
+ *
6736
+ * @example
6737
+ * ```tsx
6738
+ * import { NiceThemePicker, NICE_THEME_PICKER_PRESETS } from '@nice2dev/ui';
6739
+ *
6740
+ * <NiceThemePicker
6741
+ * themes={NICE_THEME_PICKER_PRESETS}
6742
+ * value={themeId}
6743
+ * onChange={(opt) => setThemeId(opt?.id ?? null)}
6744
+ * />
6745
+ * ```
6746
+ */
6747
+ export declare const NICE_THEME_PICKER_PRESETS: NiceThemeDescriptor[];
6748
+
6726
6749
  export { NICE_THEME_PRESETS }
6727
6750
 
6728
6751
  export { NiceA11yConfig }
@@ -7267,6 +7290,42 @@ export declare interface NiceAuditLogProps {
7267
7290
  'data-testid'?: string;
7268
7291
  }
7269
7292
 
7293
+ export declare const NiceAuthButtons: default_2.ForwardRefExoticComponent<NiceAuthButtonsProps & default_2.RefAttributes<HTMLDivElement>>;
7294
+
7295
+ export declare interface NiceAuthButtonsProps {
7296
+ /**
7297
+ * Authenticated user — when set, renders the user-menu instead of
7298
+ * login/register buttons.
7299
+ */
7300
+ user?: NiceAuthUser;
7301
+ /** Items shown in the user-menu dropdown (only when `user` is set). */
7302
+ userMenuItems?: UserMenuItem[];
7303
+ /** Convenience handler appended as a "Profile" item if no items are given. */
7304
+ onProfile?: () => void;
7305
+ /** Convenience handler appended as a "Logout" item if no items are given. */
7306
+ onLogout?: () => void;
7307
+ /** Show the "Sign in" button when no `user`. Default: `true`. */
7308
+ showLogin?: boolean;
7309
+ /** Login button label. */
7310
+ loginLabel?: string;
7311
+ /** Login click handler. */
7312
+ onLoginClick?: () => void;
7313
+ /** Show the "Register" button when no `user`. Default: auto-true if `onRegisterClick` provided. */
7314
+ showRegister?: boolean;
7315
+ /** Register button label. */
7316
+ registerLabel?: string;
7317
+ /** Register click handler. */
7318
+ onRegisterClick?: () => void;
7319
+ /** Button size. */
7320
+ size?: NiceSize;
7321
+ /** Compact mode — hides login button text on narrow viewports (CSS-driven). */
7322
+ compact?: boolean;
7323
+ className?: string;
7324
+ style?: default_2.CSSProperties;
7325
+ id?: string;
7326
+ 'data-testid'?: string;
7327
+ }
7328
+
7270
7329
  /**
7271
7330
  * {@link NiceAuthGuard} — Protected route/section wrapper.
7272
7331
  * Checks authentication and permission/role requirements before rendering children.
@@ -7297,6 +7356,21 @@ export declare interface NiceAuthGuardProps {
7297
7356
  children: default_2.ReactNode;
7298
7357
  }
7299
7358
 
7359
+ export declare interface NiceAuthUser {
7360
+ /** Display name. */
7361
+ name: string;
7362
+ /** Avatar image URL. */
7363
+ avatarUrl?: string;
7364
+ /** Initials fallback (auto-derived from `name` when omitted). */
7365
+ initials?: string;
7366
+ /** Optional email address shown in the user-menu header. */
7367
+ email?: string;
7368
+ /** Optional role/title shown in the user-menu header. */
7369
+ role?: string;
7370
+ /** Online status indicator. */
7371
+ status?: 'online' | 'away' | 'busy' | 'offline';
7372
+ }
7373
+
7300
7374
  export declare const NiceAutocomplete: default_2.FC<NiceAutocompleteProps>;
7301
7375
 
7302
7376
  /** Props for the {@link NiceAutocomplete} component — a text input with filtered suggestion dropdown and optional multi-select. */
@@ -11221,6 +11295,8 @@ export declare interface NiceFileManagerProps extends NiceBaseProps {
11221
11295
  viewMode?: 'list' | 'detail' | 'thumbnails';
11222
11296
  selectable?: boolean;
11223
11297
  showBreadcrumb?: boolean;
11298
+ /** Show top toolbar with single/dual-pane switch + view mode toggles + search */
11299
+ showTopToolbar?: boolean;
11224
11300
  /** Show function-key toolbar at bottom (dual-pane style) */
11225
11301
  showFnToolbar?: boolean;
11226
11302
  /** Show status bar with selection summary */
@@ -11257,6 +11333,10 @@ export declare interface NiceFileManagerProps extends NiceBaseProps {
11257
11333
  onRefresh?: (panel?: NiceFilePanel) => void;
11258
11334
  /** Sort change */
11259
11335
  onSortChange?: (sort: NiceFileSort, panel?: NiceFilePanel) => void;
11336
+ /** Top toolbar — toggle dual-pane mode (called when user clicks Single/Dual buttons) */
11337
+ onDualPaneChange?: (dual: boolean) => void;
11338
+ /** Top toolbar — change view mode */
11339
+ onViewModeChange?: (mode: 'list' | 'detail' | 'thumbnails') => void;
11260
11340
  }
11261
11341
 
11262
11342
  /** Active panel identifier for dual-pane {@link NiceFileManager}. */
@@ -12498,6 +12578,31 @@ export { NiceInfiniteScrollConfig }
12498
12578
 
12499
12579
  export { NiceInfiniteScrollState }
12500
12580
 
12581
+ /**
12582
+ * Shared meal/recipe/ingredient models.
12583
+ *
12584
+ * Used by:
12585
+ * - NiceRecipe (planning) — display
12586
+ * - NiceRecipeEditor (tools) — editing
12587
+ * - NiceScheduler (planning) — when an event has `eventType: 'recipe'`
12588
+ */
12589
+ /** A single measurable component of a recipe (e.g. "200 g flour"). */
12590
+ export declare interface NiceIngredient {
12591
+ id: string;
12592
+ /** Display name, e.g. "All-purpose flour". */
12593
+ name: string;
12594
+ /** Numeric amount (parsed). Use `unit` for the measurement. */
12595
+ quantity?: number;
12596
+ /** Free-form unit string: "g", "ml", "tbsp", "cup", "pcs". */
12597
+ unit?: string;
12598
+ /** Free-form notes shown next to the ingredient ("sifted", "room temp"). */
12599
+ notes?: string;
12600
+ /** Optional grouping ("Dough", "Filling", "Topping"). */
12601
+ group?: string;
12602
+ /** Marks the ingredient as completed in interactive shopping/cook mode. */
12603
+ checked?: boolean;
12604
+ }
12605
+
12501
12606
  export { NiceInlineHelp }
12502
12607
 
12503
12608
  export { NiceInlineHelpProps }
@@ -12694,6 +12799,8 @@ export declare interface NiceKanbanBoardProps extends NiceBaseProps, TracelessSt
12694
12799
  size?: NiceSize;
12695
12800
  /** Allow columns to be collapsed */
12696
12801
  collapsible?: boolean;
12802
+ /** Layout mode — `scroll` (default, horizontal scroll when overflowing) or `responsive` (columns wrap to fit container width). */
12803
+ layoutMode?: NiceKanbanLayoutMode;
12697
12804
  /** View mode (default, compact, detailed) */
12698
12805
  viewMode?: NiceKanbanViewMode;
12699
12806
  /** Callback when view mode changes */
@@ -12748,6 +12855,11 @@ export declare interface NiceKanbanColumn {
12748
12855
  limit?: number;
12749
12856
  }
12750
12857
 
12858
+ /** Layout mode for the kanban board container.
12859
+ * - `scroll`: Columns keep their min/max width and the board scrolls horizontally when they don't fit (default).
12860
+ * - `responsive`: Columns wrap onto multiple rows and flex-grow to fill the available width — no horizontal overflow. */
12861
+ declare type NiceKanbanLayoutMode = 'scroll' | 'responsive';
12862
+
12751
12863
  /** Persisted state for NiceKanbanBoard */
12752
12864
  export declare interface NiceKanbanPersistedState {
12753
12865
  /** Collapsed column keys */
@@ -12816,8 +12928,19 @@ export declare interface NiceLanguagePickerProps extends NiceFormFieldProps, Dua
12816
12928
  placeholder?: string;
12817
12929
  /** Enable search */
12818
12930
  showSearch?: boolean;
12819
- /** Search placeholder */
12931
+ /**
12932
+ * Threshold below which the internal search/filter input is hidden even
12933
+ * when `showSearch` is `true`. Prevents a noisy filter UI for short lists
12934
+ * (e.g. 5 languages). Default: `8`. Set `0` to always show, `Infinity` to
12935
+ * always hide.
12936
+ */
12937
+ searchThreshold?: number;
12938
+ /** Search placeholder. Default: translated `'Filter languages…'`. */
12820
12939
  searchPlaceholder?: string;
12940
+ /** Controlled open state (for coordinating with sibling controls). */
12941
+ isOpen?: boolean;
12942
+ /** Notified whenever the dropdown open state changes. */
12943
+ onOpenChange?: (open: boolean) => void;
12821
12944
  /** Show BCP-47 code in trigger. Default: false (compact) */
12822
12945
  showCodeInValue?: boolean;
12823
12946
  /** Show BCP-47 code in dropdown options. Default: true */
@@ -13351,6 +13474,57 @@ export declare interface NiceLoginFormProps extends NiceBaseProps {
13351
13474
  passwordPlaceholder?: string;
13352
13475
  }
13353
13476
 
13477
+ export declare const NiceLogo: default_2.ForwardRefExoticComponent<NiceLogoProps & default_2.RefAttributes<HTMLElement>>;
13478
+
13479
+ export declare interface NiceLogoProps {
13480
+ /** Image URL to render as `<img>`. Has priority over `icon` and `variant`. */
13481
+ src?: string;
13482
+ /** Custom icon node (SVG / NiceIcon / emoji). Has priority over `variant`. */
13483
+ icon?: default_2.ReactNode;
13484
+ /**
13485
+ * Pre-built brand mark variant from the OmniVerk family.
13486
+ * Used when neither `src` nor `icon` is provided.
13487
+ * Default: `'mark'`.
13488
+ */
13489
+ variant?: NiceLogoVariant;
13490
+ /** Brand name rendered next to the icon. Hidden if `iconOnly` is true. */
13491
+ text?: string;
13492
+ /** Render only the icon (no text). */
13493
+ iconOnly?: boolean;
13494
+ /** Render only the text (no icon). */
13495
+ textOnly?: boolean;
13496
+ /**
13497
+ * Logo height in pixels — width is derived to preserve aspect ratio.
13498
+ * Accepts presets (`xs`/`sm`/`md`/`lg`/`xl`) or a raw number.
13499
+ * Default: `'md'` (32 px).
13500
+ */
13501
+ size?: NiceLogoSize;
13502
+ /**
13503
+ * Render as `<a href>` link.
13504
+ * If neither `href` nor `onClick` is set, the logo is a static `<span>`.
13505
+ */
13506
+ href?: string;
13507
+ /** Click handler — renders as `<button>`. */
13508
+ onClick?: () => void;
13509
+ /** Accessible label (default: `text` or "Brand"). */
13510
+ ariaLabel?: string;
13511
+ className?: string;
13512
+ style?: default_2.CSSProperties;
13513
+ id?: string;
13514
+ 'data-testid'?: string;
13515
+ }
13516
+
13517
+ export declare type NiceLogoSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | number;
13518
+
13519
+ /**
13520
+ * Brand mark variant.
13521
+ * - `mark` (default): symbol only — diamond + triangle (NtdOmniVerk).
13522
+ * - `badge`: rounded-square enclosed mark (NtdOmniVerkBadge), good for favicons / chips.
13523
+ * - `spinner`: animated rotating mark (NtdOmniVerkSpinner) — use for loading states.
13524
+ * - `logo`: full mark + wordmark side-by-side (NtdOmniVerkLogo).
13525
+ */
13526
+ export declare type NiceLogoVariant = 'mark' | 'badge' | 'spinner' | 'logo';
13527
+
13354
13528
  export declare const NiceLookup: default_2.FC<NiceLookupProps>;
13355
13529
 
13356
13530
  /** Column definition for the mini-grid lookup mode. */
@@ -13657,50 +13831,50 @@ export declare interface NiceMdiWorkspaceProps extends NiceBaseProps {
13657
13831
  unsavedWarningMessage?: string;
13658
13832
  }
13659
13833
 
13660
- export declare const NiceMegaMenu: default_2.ForwardRefExoticComponent<NiceMegaMenuProps & default_2.RefAttributes<HTMLDivElement>>;
13661
-
13662
- /** A column within a {@link NiceMegaMenuPanel}. */
13663
- export declare interface NiceMegaMenuColumn {
13664
- /** Optional column header text. */
13665
- header?: string;
13666
- /** Menu items in this column. */
13667
- items: NiceMegaMenuItem[];
13668
- }
13669
-
13670
- /** A clickable item inside a {@link NiceMegaMenuColumn}. */
13671
- export declare interface NiceMegaMenuItem {
13672
- /** Unique key. */
13673
- key: string;
13674
- /** Display label. */
13675
- label: string;
13676
- /** Optional icon. */
13677
- icon?: default_2.ReactNode;
13678
- /** If set, renders the item as a link. */
13679
- href?: string;
13680
- /** Click handler. */
13681
- onClick?: () => void;
13682
- /** Disable the item. */
13683
- disabled?: boolean;
13834
+ /** A planned meal references one or more recipes. */
13835
+ export declare interface NiceMeal {
13836
+ id: string;
13837
+ /** Display name, e.g. "Sunday Brunch". */
13838
+ name: string;
13839
+ /** Date/time the meal is served. */
13840
+ servedAt?: Date;
13841
+ kind?: NiceMealKind;
13842
+ /** Recipes that compose this meal. */
13843
+ recipeIds: string[];
13844
+ /** Optional override of total servings for this meal. */
13845
+ servings?: number;
13846
+ notes?: string;
13684
13847
  }
13685
13848
 
13686
- /** A top-level panel (mega dropdown) in the {@link NiceMegaMenu}. */
13687
- export declare interface NiceMegaMenuPanel {
13688
- /** Unique key. */
13689
- key: string;
13690
- /** Panel trigger label. */
13691
- label: string;
13692
- /** Multi-column layout. */
13693
- columns: NiceMegaMenuColumn[];
13694
- /** Fully custom panel renderer (overrides columns). */
13695
- renderPanel?: () => default_2.ReactNode;
13696
- }
13849
+ /** Meal kind used by meal planners. */
13850
+ export declare type NiceMealKind = 'breakfast' | 'lunch' | 'dinner' | 'snack' | 'other';
13697
13851
 
13698
- /** Props for the {@link NiceMegaMenu} component — a desktop mega-dropdown navigation bar. */
13699
- export declare interface NiceMegaMenuProps extends NiceBaseProps {
13700
- /** Panel definitions. */
13701
- items: NiceMegaMenuPanel[];
13702
- /** Size preset. */
13703
- size?: NiceSize;
13852
+ /**
13853
+ * Weekly meal planner rows are meal kinds (breakfast/lunch/dinner by
13854
+ * default), columns are the seven days starting at {@link weekStart}.
13855
+ * Each cell shows the meals served at that day+kind; users can add a
13856
+ * recipe from the pool via the cell's `+` picker, or remove individual
13857
+ * meal cards. Pure-client state (raises {@link onChange} with the new
13858
+ * meals array).
13859
+ *
13860
+ * Pairs naturally with `NiceScheduler` — meal `servedAt` dates can be
13861
+ * surfaced as scheduler events upstream.
13862
+ */
13863
+ export declare const NiceMealPlan: default_2.FC<NiceMealPlanProps>;
13864
+
13865
+ export declare interface NiceMealPlanProps extends NiceBaseProps {
13866
+ /** Pool of recipes the user can pick from. */
13867
+ recipes: NiceRecipeModel[];
13868
+ /** Planned meals. */
13869
+ meals: NiceMeal[];
13870
+ /** Called whenever the meal list changes. */
13871
+ onChange?: (meals: NiceMeal[]) => void;
13872
+ /** First day of the week to render (defaults to today's Monday). */
13873
+ weekStart?: Date;
13874
+ /** Which meal-kind rows to show (default: breakfast/lunch/dinner). */
13875
+ rows?: NiceMealKind[];
13876
+ /** Read-only mode (no add/remove/move). */
13877
+ readOnly?: boolean;
13704
13878
  }
13705
13879
 
13706
13880
  export declare const NiceMention: default_2.ForwardRefExoticComponent<NiceMentionProps & default_2.RefAttributes<HTMLTextAreaElement>>;
@@ -13731,34 +13905,146 @@ export declare interface NiceMentionSuggestion {
13731
13905
 
13732
13906
  export declare const NiceMenu: default_2.FC<NiceMenuProps>;
13733
13907
 
13734
- /** A single item (or sub-menu) in the {@link NiceMenu}. */
13908
+ export declare type NiceMenuAlign = 'start' | 'center' | 'end';
13909
+
13910
+ export declare type NiceMenuDensity = 'compact' | 'normal' | 'comfortable';
13911
+
13912
+ /**
13913
+ * A single entry in {@link NiceMenu}. Both legacy (`key` + `text` + `items`)
13914
+ * and new (`id` + `label` + `children`) shapes are accepted; new fields
13915
+ * take precedence when both are supplied.
13916
+ */
13735
13917
  export declare interface NiceMenuItem {
13736
- /** Unique key. */
13737
- key: string;
13738
- /** Display text. */
13739
- text: string;
13740
- /** Icon element. */
13918
+ /** New canonical identifier. */
13919
+ id?: string;
13920
+ /** Legacy alias for `id`. */
13921
+ key?: string;
13922
+ /** New canonical label (string or arbitrary node). */
13923
+ label?: default_2.ReactNode;
13924
+ /** Legacy alias for `label`. */
13925
+ text?: string;
13926
+ /** Optional small description shown under the label inside dropdown panels. */
13927
+ description?: default_2.ReactNode;
13928
+ /** Leading icon. */
13741
13929
  icon?: default_2.ReactNode;
13742
- /** Disable this item. */
13930
+ /** Optional badge (string / number) shown to the right of the label. */
13931
+ badge?: default_2.ReactNode;
13932
+ /** When set, renders the entry as an `<a>`. */
13933
+ href?: string;
13934
+ /** Anchor target. */
13935
+ target?: string;
13936
+ /** Anchor rel. */
13937
+ rel?: string;
13938
+ /** Click handler. */
13939
+ onClick?: (event: default_2.MouseEvent) => void;
13940
+ /** Disable the entry. */
13743
13941
  disabled?: boolean;
13744
- /** Nested sub-menu items. */
13942
+ /** Render the entry as a danger / destructive action. */
13943
+ danger?: boolean;
13944
+ /** When `true`, render a horizontal divider instead of an entry (panel-only). */
13945
+ divider?: boolean;
13946
+ /** New canonical children list (only the first level of nesting opens a flyout). */
13947
+ children?: NiceMenuItem[];
13948
+ /** Legacy alias for `children`. */
13745
13949
  items?: NiceMenuItem[];
13746
- /** Click handler. */
13747
- onClick?: () => void;
13950
+ /** Tooltip / `aria-label` override. */
13951
+ ariaLabel?: string;
13748
13952
  }
13749
13953
 
13750
- /** Props for the {@link NiceMenu} component — a horizontal or vertical navigation menu with nested sub-menus. */
13954
+ export declare type NiceMenuOrientation = 'horizontal' | 'vertical';
13955
+
13751
13956
  export declare interface NiceMenuProps extends NiceBaseProps {
13752
- /** Size variant. */
13753
- size?: NiceSize;
13754
13957
  /** Menu items. */
13755
13958
  items: NiceMenuItem[];
13756
13959
  /** Layout direction. */
13757
- orientation?: 'horizontal' | 'vertical';
13758
- /** Called when any item is clicked. */
13759
- onItemClick?: (item: NiceMenuItem) => void;
13960
+ orientation?: NiceMenuOrientation;
13961
+ /** Visual style. */
13962
+ variant?: NiceMenuVariant;
13963
+ /** Density preset (paddings + font size). */
13964
+ density?: NiceMenuDensity;
13965
+ /** Size preset. */
13966
+ size?: NiceSize;
13967
+ /** Stretch top-level items to fill the container. */
13968
+ fullWidth?: boolean;
13969
+ /** Show vertical separators between top items. */
13970
+ showDividers?: boolean;
13971
+ /** Top-item alignment for dropdown panels. */
13972
+ panelAlign?: NiceMenuAlign;
13973
+ /** Min width for dropdown / sub-panel (px). */
13974
+ panelMinWidth?: number;
13975
+ /** Max width for dropdown / sub-panel (px). */
13976
+ panelMaxWidth?: number;
13977
+ /**
13978
+ * Gap (in px or any CSS length) between top-level items. Use `0` for
13979
+ * a fully flush bar (e.g. tab-bar look). Default: density-driven (`4px`).
13980
+ */
13981
+ itemGap?: number | string;
13982
+ /**
13983
+ * Horizontal padding inside each top-level button. Overrides density.
13984
+ * Accepts a number (treated as `px`) or any CSS length.
13985
+ */
13986
+ paddingX?: number | string;
13987
+ /**
13988
+ * Vertical padding inside each top-level button. Overrides density.
13989
+ * Accepts a number (treated as `px`) or any CSS length.
13990
+ */
13991
+ paddingY?: number | string;
13992
+ /**
13993
+ * Render dropdown / sub-panels in a `document.body` portal so the menu
13994
+ * never gets clipped by `overflow: hidden` ancestors. Default: `true`.
13995
+ * Set `false` to fall back to the legacy absolute-positioned panel.
13996
+ */
13997
+ portal?: boolean;
13998
+ /**
13999
+ * z-index applied to the portalled dropdown panel. Default: `1100`.
14000
+ */
14001
+ panelZIndex?: number;
14002
+ /** Custom arrow node for items with children. Default: `▾`. */
14003
+ arrowIcon?: default_2.ReactNode;
14004
+ /** Custom flyout arrow shown next to nested items. Default: `▸`. */
14005
+ flyoutArrowIcon?: default_2.ReactNode;
14006
+ /** Close the panel after selecting any leaf entry. Default: `true`. */
14007
+ closeOnSelect?: boolean;
14008
+ /**
14009
+ * How to open dropdown panels:
14010
+ * - `click` (default) — toggle on trigger click only.
14011
+ * - `hover` — open on pointer-enter, close on pointer-leave (after `closeDelay`).
14012
+ * - `both` — opens on hover *and* click (best-of-both for mega-menus).
14013
+ */
14014
+ openTrigger?: 'click' | 'hover' | 'both';
14015
+ /** Delay (ms) before opening on hover. Default: `120`. */
14016
+ openDelay?: number;
14017
+ /** Delay (ms) before closing after pointer leaves the menu+panel. Default: `180`. */
14018
+ closeDelay?: number;
14019
+ /** Notified whenever the open trigger id changes (null = closed). */
14020
+ onOpenChange?: (id: string | null) => void;
14021
+ /** Highlight the matching id (or any of its ancestors). */
14022
+ activeId?: string;
14023
+ /** Legacy alias for `activeId`. */
14024
+ activeKey?: string;
14025
+ /** Called when any leaf is clicked. */
14026
+ onItemClick?: (item: NiceMenuItem, event: default_2.MouseEvent) => void;
14027
+ /** Accessible name for the wrapper `<nav>`. */
14028
+ ariaLabel?: string;
14029
+ /** Optional renderer for top-level trigger label (allows wrapping with i18n components). */
14030
+ renderTriggerLabel?: (item: NiceMenuItem) => default_2.ReactNode;
14031
+ /** Optional renderer for panel-entry label. */
14032
+ renderEntryLabel?: (item: NiceMenuItem) => default_2.ReactNode;
13760
14033
  }
13761
14034
 
14035
+ /**
14036
+ * Visual style for top-level triggers.
14037
+ * - `separated` — soft buttons with gap (default-ish)
14038
+ * - `group` — flush button-group with shared border
14039
+ * - `pills` — rounded pills, primary fill on active
14040
+ * - `ghost` — chrome-less, hover only (used by NiceTopNav)
14041
+ * - `solid` — opaque buttons on `--bg-elevated`
14042
+ * - `underline` — flat with animated underline on hover/active
14043
+ * - `tabs` — tab-bar look (top-rounded, bottom border)
14044
+ * - `glass` — translucent blurred background
14045
+ */
14046
+ export declare type NiceMenuVariant = 'separated' | 'group' | 'pills' | 'ghost' | 'solid' | 'underline' | 'tabs' | 'glass' | 'bordered' | 'borderless';
14047
+
13762
14048
  export declare const NiceMergeRequestBuilder: default_2.FC<NiceMergeRequestBuilderProps>;
13763
14049
 
13764
14050
  export declare interface NiceMergeRequestBuilderProps extends NiceBaseProps {
@@ -14319,6 +14605,197 @@ export declare interface NiceNavbarProps extends NiceFormFieldProps {
14319
14605
  onBrandClick?: () => void;
14320
14606
  }
14321
14607
 
14608
+ export declare const NiceNavMenu: default_2.ForwardRefExoticComponent<NiceNavMenuProps & default_2.RefAttributes<HTMLElement>>;
14609
+
14610
+ export declare type NiceNavMenuAlign = 'start' | 'end' | 'auto';
14611
+
14612
+ export declare interface NiceNavMenuItem {
14613
+ /** Stable id used for active-marking and keyboard focus. */
14614
+ id: string;
14615
+ /** Displayed label. */
14616
+ label: default_2.ReactNode;
14617
+ /** Optional icon (emoji, SVG node, NiceIcon). */
14618
+ icon?: default_2.ReactNode;
14619
+ /** Navigation href (rendered as `<a>` when no children). */
14620
+ href?: string;
14621
+ /** Anchor `target` attribute (only when `href` is set). */
14622
+ target?: '_self' | '_blank' | '_parent' | '_top';
14623
+ /** Anchor `rel` attribute (only when `href` is set). */
14624
+ rel?: string;
14625
+ /** Click handler (rendered as `<button>` when no `href`). */
14626
+ onClick?: (e: default_2.MouseEvent) => void;
14627
+ /** Disable the item. */
14628
+ disabled?: boolean;
14629
+ /** Render as a danger action (red text). */
14630
+ danger?: boolean;
14631
+ /** Render as a divider (label/icon ignored). */
14632
+ divider?: boolean;
14633
+ /** Optional badge node rendered to the right of the label. */
14634
+ badge?: default_2.ReactNode;
14635
+ /** Optional secondary text shown under the label inside dropdowns. */
14636
+ description?: string;
14637
+ /** Sub-items (only honored at level-1 to produce a level-2 flyout). */
14638
+ children?: NiceNavMenuItem[];
14639
+ /**
14640
+ * **Mega menu** — when set on a top-level item, opens a FULL-WIDTH panel
14641
+ * anchored to the bar's bottom edge instead of a floating dropdown. Use for
14642
+ * marketing/SaaS navs where you want rich multi-column content.
14643
+ *
14644
+ * Either pass a ready `megaPanel` JSX node, or use the structured
14645
+ * `megaColumns` shorthand which renders a clean column-based layout for you.
14646
+ * Both can be set; `megaPanel` wins.
14647
+ */
14648
+ megaPanel?: default_2.ReactNode | (() => default_2.ReactNode);
14649
+ /** Structured mega-menu data — rendered as columns of items. */
14650
+ megaColumns?: NiceNavMenuMegaColumn[];
14651
+ /** Optional footer node rendered at the bottom of the mega panel (CTA strip). */
14652
+ megaFooter?: default_2.ReactNode;
14653
+ }
14654
+
14655
+ /** A single column of items inside a mega-menu panel. */
14656
+ export declare interface NiceNavMenuMegaColumn {
14657
+ /** Optional column heading. */
14658
+ title?: default_2.ReactNode;
14659
+ /** Items rendered in the column (no nested mega; each is a simple item). */
14660
+ items: NiceNavMenuItem[];
14661
+ /** Optional footer node under this column (e.g. "View all" link). */
14662
+ footer?: default_2.ReactNode;
14663
+ }
14664
+
14665
+ export declare interface NiceNavMenuProps {
14666
+ /** Top-level items. */
14667
+ items: NiceNavMenuItem[];
14668
+ /** Currently active item id (matched against any nested item id). */
14669
+ activeId?: string;
14670
+ /** Size scale. Default `'md'`. */
14671
+ size?: NiceNavMenuSize;
14672
+ /** Dropdown panel alignment. Default `'start'`. */
14673
+ align?: NiceNavMenuAlign;
14674
+ /** Accessible label for the surrounding `<nav>`. */
14675
+ ariaLabel?: string;
14676
+ /** Render full-width (top-level items stretch to fill). Default `false`. */
14677
+ stretch?: boolean;
14678
+ /**
14679
+ * How top-level dropdowns / mega-panels open. Default `'click'` for backward
14680
+ * compatibility. Set to `'hover'` to get the classical desktop mega-menu
14681
+ * pattern (Apple / Microsoft / Stripe) — opens on mouse-enter, closes after
14682
+ * a short grace delay so the cursor can travel into the panel.
14683
+ */
14684
+ trigger?: 'click' | 'hover';
14685
+ /** Hover-close grace delay in ms. Default 150. Only used when `trigger='hover'`. */
14686
+ hoverCloseDelay?: number;
14687
+ /** Pass-through className. */
14688
+ className?: string;
14689
+ /** Pass-through style. */
14690
+ style?: default_2.CSSProperties;
14691
+ /** Pass-through id. */
14692
+ id?: string;
14693
+ /** Test id. */
14694
+ 'data-testid'?: string;
14695
+ }
14696
+
14697
+ export declare type NiceNavMenuSize = 'sm' | 'md' | 'lg';
14698
+
14699
+ export declare const NiceNavShell: ForwardRefExoticComponent<NiceNavShellProps & RefAttributes<HTMLDivElement>>;
14700
+
14701
+ export declare interface NiceNavShellApi {
14702
+ activeRoute: string | undefined;
14703
+ tabs: NiceNavShellTab[];
14704
+ openRoute: (route: string, opts?: Partial<NiceNavShellTab>) => void;
14705
+ closeTab: (id: string) => void;
14706
+ closeOthers: (id: string) => void;
14707
+ closeAll: () => void;
14708
+ pinTab: (id: string, pinned?: boolean) => void;
14709
+ setDirty: (id: string, dirty?: boolean) => void;
14710
+ }
14711
+
14712
+ export declare type NiceNavShellPersistence = 'memory' | 'localStorage' | 'session';
14713
+
14714
+ export declare interface NiceNavShellProps {
14715
+ /** Top navigation slot — pass a ReactNode or render-prop. */
14716
+ topNav?: Slot;
14717
+ /**
14718
+ * Convenience pass-through: when set (and `topNav` is not), the shell
14719
+ * renders an internal `<NiceTopNav>` with these props. Lets consumers get
14720
+ * a fully-featured top bar (logo / nav menu / search / pickers /
14721
+ * notifications / user menu / collapsible right cluster) without having
14722
+ * to import and instantiate NiceTopNav themselves.
14723
+ */
14724
+ topNavProps?: NiceTopNavProps;
14725
+ /** Sidebar navigation slot. */
14726
+ sidebar?: Slot;
14727
+ /** Map of route → content (ReactNode or factory). */
14728
+ routes: Record<string, ReactNode | (() => ReactNode)>;
14729
+ /** Initial / default route (used when uncontrolled). */
14730
+ defaultRoute?: string;
14731
+ /** Controlled active route. */
14732
+ activeRoute?: string;
14733
+ /** Called whenever the active route changes. */
14734
+ onRouteChange?: (route: string) => void;
14735
+ /** Optional per-route labels (used for tab titles). */
14736
+ routeLabels?: Record<string, ReactNode>;
14737
+ /** Optional per-route icons. */
14738
+ routeIcons?: Record<string, ReactNode>;
14739
+ /** Fallback rendered when active route has no entry in `routes`. */
14740
+ fallback?: ReactNode;
14741
+ /**
14742
+ * Rendered in the content area when no route is active (uncontrolled mode
14743
+ * with no `defaultRoute`). Defaults to a blank panel painted with the
14744
+ * theme background — intentionally empty so the shell never auto-jumps to
14745
+ * the first route. Pass any node to customise (welcome screen, hero,
14746
+ * shortcuts grid, etc.).
14747
+ */
14748
+ emptyState?: ReactNode;
14749
+ /** `'enabled'` shows the tab strip; `'disabled'` (default) just routes content. */
14750
+ tabsMode?: 'enabled' | 'disabled';
14751
+ /** When `false` (default) navigating to an already-open route focuses it instead of duplicating. */
14752
+ allowDuplicateTabs?: boolean;
14753
+ /** Maximum number of tabs (oldest non-pinned auto-closes when exceeded). */
14754
+ maxTabs?: number;
14755
+ /** Show close X. Default `true`. */
14756
+ closableTabs?: boolean;
14757
+ /** Allow pin/unpin via context menu. Default `true`. */
14758
+ pinnableTabs?: boolean;
14759
+ /** Reorder via drag (shipped as basic HTML5 drag — opt-in). Default `false`. */
14760
+ reorderableTabs?: boolean;
14761
+ /** Persistence backend for tab list. Default `'memory'`. */
14762
+ persistTabs?: NiceNavShellPersistence;
14763
+ /** Storage key for persistence. Default `'nice-nav-shell:tabs'`. */
14764
+ persistKey?: string;
14765
+ /** Tab strip is wheel-scrollable + shows ◀▶ arrows on overflow. Default `true`. */
14766
+ tabsScrollable?: boolean;
14767
+ /** Right-click tab → menu (close / close others / close all / pin). Default `true`. */
14768
+ tabsContextMenu?: boolean;
14769
+ /** Content swap animation. Default `'fade'`. */
14770
+ tabsAnimation?: NiceNavShellTabsAnimation;
14771
+ /** Initial tab list (used only on first mount when storage is empty). */
14772
+ initialTabs?: NiceNavShellTab[];
14773
+ /** Routes auto-opened as pinned on first mount. */
14774
+ pinnedRoutes?: string[];
14775
+ className?: string;
14776
+ contentClassName?: string;
14777
+ 'data-testid'?: string;
14778
+ }
14779
+
14780
+ export declare interface NiceNavShellTab {
14781
+ /** Unique stable id. Defaults to `route` if omitted at openRoute call. */
14782
+ id: string;
14783
+ /** Route key the tab represents. */
14784
+ route: string;
14785
+ /** Tab label (string or arbitrary node). */
14786
+ label: ReactNode;
14787
+ /** Optional leading icon. */
14788
+ icon?: ReactNode;
14789
+ /** Pinned tabs render first and have no close button by default. */
14790
+ pinned?: boolean;
14791
+ /** When true, shows a `•` dot indicating unsaved work. */
14792
+ dirty?: boolean;
14793
+ /** Per-tab override of `closableTabs`. */
14794
+ closable?: boolean;
14795
+ }
14796
+
14797
+ export declare type NiceNavShellTabsAnimation = 'none' | 'fade' | 'slide';
14798
+
14322
14799
  export declare const NiceNetworkDiscoveryPanel: default_2.FC<NiceNetworkDiscoveryPanelProps>;
14323
14800
 
14324
14801
  export declare interface NiceNetworkDiscoveryPanelProps extends NiceBaseProps {
@@ -14412,6 +14889,24 @@ export declare interface NiceNotificationChannel {
14412
14889
  configUrl?: string;
14413
14890
  }
14414
14891
 
14892
+ export declare interface NiceNotificationItem {
14893
+ id: string;
14894
+ title: string;
14895
+ body?: string;
14896
+ /** Visual level (controls color of marker dot). Default `'info'`. */
14897
+ level?: NiceNotificationLevel;
14898
+ /** Optional ISO date string or Date instance. */
14899
+ timestamp?: string | Date;
14900
+ /** Whether this notification has already been seen. */
14901
+ read?: boolean;
14902
+ /** Optional icon/avatar node. */
14903
+ icon?: default_2.ReactNode;
14904
+ /** Click handler — fires when the row is activated. */
14905
+ onClick?: () => void;
14906
+ }
14907
+
14908
+ export declare type NiceNotificationLevel = 'info' | 'success' | 'warning' | 'error';
14909
+
14415
14910
  export declare const NiceNotificationPreferences: default_2.FC<NiceNotificationPreferencesProps>;
14416
14911
 
14417
14912
  export declare interface NiceNotificationPreferencesProps extends NiceBaseProps {
@@ -14444,6 +14939,49 @@ export declare interface NiceNotificationPrefs {
14444
14939
  };
14445
14940
  }
14446
14941
 
14942
+ export declare const NiceNotifications: default_2.ForwardRefExoticComponent<NiceNotificationsProps & default_2.RefAttributes<HTMLDivElement>>;
14943
+
14944
+ export declare interface NiceNotificationsProps {
14945
+ /** List of notifications. */
14946
+ items?: NiceNotificationItem[];
14947
+ /**
14948
+ * Optional explicit unread count. When omitted, it is computed from
14949
+ * `items.filter(i => !i.read).length`.
14950
+ */
14951
+ unreadCount?: number;
14952
+ /** Title rendered at the top of the dropdown panel. */
14953
+ panelTitle?: string;
14954
+ /** Empty-state text. */
14955
+ emptyText?: string;
14956
+ /** Width (px) of the dropdown panel. Default: 340. */
14957
+ panelWidth?: number;
14958
+ /** Maximum dropdown height (px). Default: 420. */
14959
+ maxHeight?: number;
14960
+ /** Show "Mark all as read" link in panel header. Default: true. */
14961
+ showMarkAllRead?: boolean;
14962
+ /** Show "View all" link at panel footer. Default: false. */
14963
+ showViewAll?: boolean;
14964
+ /** Mark-all-as-read handler. */
14965
+ onMarkAllRead?: () => void;
14966
+ /** View-all handler. */
14967
+ onViewAll?: () => void;
14968
+ /** Per-item read-toggle handler (called when user marks an item read). */
14969
+ onItemRead?: (id: string) => void;
14970
+ /** Custom bell icon. */
14971
+ icon?: default_2.ReactNode;
14972
+ /** Controlled open flag. */
14973
+ open?: boolean;
14974
+ onOpenChange?: (open: boolean) => void;
14975
+ /** Cap the badge display (default 99 → shows "99+"). */
14976
+ badgeMax?: number;
14977
+ /** Size variant of the trigger. */
14978
+ size?: 'sm' | 'md' | 'lg';
14979
+ className?: string;
14980
+ style?: default_2.CSSProperties;
14981
+ id?: string;
14982
+ 'data-testid'?: string;
14983
+ }
14984
+
14447
14985
  export declare const NiceNumberInput: default_2.ForwardRefExoticComponent<NiceNumberInputProps & default_2.RefAttributes<HTMLInputElement>>;
14448
14986
 
14449
14987
  /** Props for the {@link NiceNumberInput} component — a numeric field with stepper and precision control. */
@@ -15880,6 +16418,165 @@ export declare interface NiceRealtimeChartRef {
15880
16418
  getData: () => RealtimeDataPoint[];
15881
16419
  }
15882
16420
 
16421
+ /**
16422
+ * Recipe display component — shows photos, metadata (servings/time/difficulty),
16423
+ * ingredient list and step-by-step instructions. Read-mostly; pair with
16424
+ * {@link NiceRecipeEditor} (from `@nice2dev/ui-tools`) for editing.
16425
+ */
16426
+ export declare const NiceRecipe: default_2.FC<NiceRecipeProps>;
16427
+
16428
+ /** A named group of recipe ids. */
16429
+ export declare interface NiceRecipeCollection {
16430
+ id: string;
16431
+ name: string;
16432
+ description?: string;
16433
+ recipeIds: string[];
16434
+ }
16435
+
16436
+ /**
16437
+ * Sidebar of named collections (cookbooks, weekly menus, themes…) plus a
16438
+ * `NiceRecipeList` filtered to the active collection's recipe ids.
16439
+ * Includes inline create / rename / delete and an "Add recipe" picker.
16440
+ */
16441
+ export declare const NiceRecipeCollections: default_2.FC<NiceRecipeCollectionsProps>;
16442
+
16443
+ export declare interface NiceRecipeCollectionsProps extends NiceBaseProps {
16444
+ /** Pool of recipes the collections reference. */
16445
+ recipes: NiceRecipeModel[];
16446
+ /** Collections to display. */
16447
+ collections: NiceRecipeCollection[];
16448
+ /** Fired when collections change (rename, add, remove, add/remove recipe). */
16449
+ onChange?: (collections: NiceRecipeCollection[]) => void;
16450
+ /** Hide create / rename / delete controls. */
16451
+ readOnly?: boolean;
16452
+ /** Fired when a recipe card inside the active collection is clicked. */
16453
+ onSelectRecipe?: (recipe: NiceRecipeModel) => void;
16454
+ }
16455
+
16456
+ /** Difficulty enum used by recipe + scheduler-recipe variant. */
16457
+ export declare type NiceRecipeDifficulty = 'easy' | 'medium' | 'hard';
16458
+
16459
+ /**
16460
+ * Recipe editor — full CRUD over a {@link NiceRecipe}: metadata,
16461
+ * ingredients (add/remove/reorder), steps (add/remove/reorder), photos
16462
+ * (URL-based). Pair with {@link NiceRecipe} (from `@nice2dev/ui-planning`)
16463
+ * for read-only display.
16464
+ */
16465
+ export declare const NiceRecipeEditor: default_2.FC<NiceRecipeEditorProps>;
16466
+
16467
+ export declare interface NiceRecipeEditorProps extends NiceBaseProps {
16468
+ /** Recipe to edit. Pass `undefined` for "new". */
16469
+ recipe?: NiceRecipeModel;
16470
+ /** Called on every change (live binding). */
16471
+ onChange?: (recipe: NiceRecipeModel) => void;
16472
+ /** Called when the user clicks Save (`showActions`). */
16473
+ onSave?: (recipe: NiceRecipeModel) => void;
16474
+ /** Called when the user clicks Cancel. */
16475
+ onCancel?: () => void;
16476
+ /** Render Save/Cancel buttons. */
16477
+ showActions?: boolean;
16478
+ /** Custom Save button label. */
16479
+ saveLabel?: string;
16480
+ /** Custom Cancel button label. */
16481
+ cancelLabel?: string;
16482
+ }
16483
+
16484
+ /**
16485
+ * Browsable, searchable, filterable grid of {@link NiceRecipe} cards.
16486
+ * Pure-client filtering: title/description/tags substring + difficulty + tag.
16487
+ */
16488
+ export declare const NiceRecipeList: default_2.FC<NiceRecipeListProps>;
16489
+
16490
+ export declare interface NiceRecipeListProps extends NiceBaseProps {
16491
+ /** Recipes to browse. */
16492
+ recipes: NiceRecipeModel[];
16493
+ /** Fired when the user activates a card. */
16494
+ onSelect?: (recipe: NiceRecipeModel) => void;
16495
+ /** Initial search query. */
16496
+ initialQuery?: string;
16497
+ /** Hide the difficulty / tag filters. */
16498
+ hideFilters?: boolean;
16499
+ /** Empty-state hint when no recipes match. */
16500
+ emptyMessage?: string;
16501
+ }
16502
+
16503
+ /** A full recipe record. */
16504
+ export declare interface NiceRecipeModel {
16505
+ id: string;
16506
+ title: string;
16507
+ description?: string;
16508
+ /** Number of servings the recipe yields. */
16509
+ servings?: number;
16510
+ prepMinutes?: number;
16511
+ cookMinutes?: number;
16512
+ difficulty?: NiceRecipeDifficulty;
16513
+ cuisine?: string;
16514
+ tags?: string[];
16515
+ ingredients: NiceIngredient[];
16516
+ steps: NiceRecipeStep[];
16517
+ photos?: NiceRecipePhoto[];
16518
+ nutrition?: NiceRecipeNutrition;
16519
+ /** External source (URL or attribution). */
16520
+ sourceUrl?: string;
16521
+ createdAt?: Date;
16522
+ updatedAt?: Date;
16523
+ }
16524
+
16525
+ /** Optional nutrition summary per serving. */
16526
+ export declare interface NiceRecipeNutrition {
16527
+ calories?: number;
16528
+ protein?: number;
16529
+ fat?: number;
16530
+ carbs?: number;
16531
+ fiber?: number;
16532
+ sugar?: number;
16533
+ sodium?: number;
16534
+ }
16535
+
16536
+ /** A photo attached to a recipe. */
16537
+ export declare interface NiceRecipePhoto {
16538
+ id: string;
16539
+ /** Image URL (data:, blob:, http(s):). */
16540
+ url: string;
16541
+ /** Alt text / caption. */
16542
+ caption?: string;
16543
+ /** When true, this photo is used as the cover image. */
16544
+ primary?: boolean;
16545
+ }
16546
+
16547
+ /** Props for {@link NiceRecipe}. */
16548
+ export declare interface NiceRecipeProps extends NiceBaseProps {
16549
+ /** Recipe to display. */
16550
+ recipe: NiceRecipeModel;
16551
+ /** Compact card layout (smaller paddings, hides description / nutrition). */
16552
+ compact?: boolean;
16553
+ /** Hide the photo gallery. */
16554
+ hidePhotos?: boolean;
16555
+ /** Hide the ingredients column. */
16556
+ hideIngredients?: boolean;
16557
+ /** Hide the steps list. */
16558
+ hideSteps?: boolean;
16559
+ /** Toggle an ingredient's `checked` state (interactive shopping mode). */
16560
+ onIngredientToggle?: (ingredient: NiceIngredient) => void;
16561
+ /** Toggle a step's `done` state (interactive cook mode). */
16562
+ onStepToggle?: (step: NiceRecipeStep) => void;
16563
+ }
16564
+
16565
+ /** A single step / instruction in a recipe. */
16566
+ export declare interface NiceRecipeStep {
16567
+ id: string;
16568
+ /** Render order (1-based). */
16569
+ order: number;
16570
+ /** Human instruction text. Markdown-friendly but rendered as plain text by default. */
16571
+ instruction: string;
16572
+ /** Optional duration in minutes for timers. */
16573
+ durationMinutes?: number;
16574
+ /** Optional URL of an image illustrating the step. */
16575
+ image?: string;
16576
+ /** Marks the step as completed in interactive cook mode. */
16577
+ done?: boolean;
16578
+ }
16579
+
15883
16580
  /**
15884
16581
  * NiceReconciliationView — Bank reconciliation split-view with drag-drop matching.
15885
16582
  *
@@ -16452,6 +17149,40 @@ export declare interface NiceSchedulerEvent {
16452
17149
  description?: string;
16453
17150
  /** Event visual style */
16454
17151
  eventStyle?: 'solid' | 'striped' | 'outlined' | 'dashed';
17152
+ /**
17153
+ * Discriminator selecting which form variant to use in the built-in editor.
17154
+ * Defaults to `'task'`. Use `'recipe'` to attach a {@link NiceRecipe} via
17155
+ * `recipe`, or `'service'` to attach service data via `service`.
17156
+ */
17157
+ eventType?: NiceSchedulerEventType;
17158
+ /** Recipe payload — present when `eventType === 'recipe'`. */
17159
+ recipe?: NiceRecipeModel;
17160
+ /** Service payload — present when `eventType === 'service'`. */
17161
+ service?: NiceSchedulerServiceData;
17162
+ }
17163
+
17164
+ /**
17165
+ * Discriminator for the kind of thing scheduled. Built-ins:
17166
+ * - `'task'` — generic event (default, back-compat).
17167
+ * - `'recipe'` — meal-prep / cooking session backed by a {@link NiceRecipe}.
17168
+ * - `'service'` — a service appointment (provider, customer, location, price).
17169
+ *
17170
+ * Consumers can extend with custom string literals — the scheduler will treat
17171
+ * unknown types like `'task'` unless a matching {@link NiceSchedulerEventTypeDef}
17172
+ * is provided in `eventTypes`.
17173
+ */
17174
+ export declare type NiceSchedulerEventType = 'task' | 'recipe' | 'service' | (string & {});
17175
+
17176
+ /** Definition of a custom event-type option exposed in the editor's type picker. */
17177
+ export declare interface NiceSchedulerEventTypeDef {
17178
+ /** Discriminator value matching {@link NiceSchedulerEvent.eventType}. */
17179
+ type: NiceSchedulerEventType;
17180
+ /** Display label in the editor select. */
17181
+ label: string;
17182
+ /** Optional emoji/icon glyph. */
17183
+ icon?: string;
17184
+ /** Optional accent color for the chip in the calendar grid. */
17185
+ color?: string;
16455
17186
  }
16456
17187
 
16457
17188
  /** Props for the {@link NiceScheduler} component — a full-featured calendar / scheduler with drag, recurring events, resources, and inline editing. */
@@ -16499,6 +17230,19 @@ export declare interface NiceSchedulerProps extends NiceBaseProps {
16499
17230
  editable?: boolean;
16500
17231
  /** Custom field set for the built-in editor — when provided, replaces the auto-generated default fields. NiceForm-compatible. */
16501
17232
  formFields?: NiceFormItem[];
17233
+ /**
17234
+ * Per-event-type form field overrides. When a key matches the active
17235
+ * `eventType` in the editor, those NiceForm items REPLACE the type-specific
17236
+ * section (recipe/service body). Use `'task'` to override the default form.
17237
+ */
17238
+ formFieldsByType?: Partial<Record<NiceSchedulerEventType, NiceFormItem[]>>;
17239
+ /**
17240
+ * Available event-type options in the editor's type picker. When omitted,
17241
+ * defaults to a single `'task'` entry (back-compat — no picker shown).
17242
+ * Pass `[{type:'task'},{type:'recipe'},{type:'service'}]` to enable all three
17243
+ * built-ins.
17244
+ */
17245
+ eventTypes?: NiceSchedulerEventTypeDef[];
16502
17246
  /** Custom full editor render — when provided, takes over the entire editor body. */
16503
17247
  renderEventEditor?: (ctx: {
16504
17248
  event?: NiceSchedulerEvent | null;
@@ -16529,6 +17273,26 @@ export declare interface NiceSchedulerResource {
16529
17273
  color?: string;
16530
17274
  }
16531
17275
 
17276
+ /** Service-specific data attached to a `service` event. */
17277
+ export declare interface NiceSchedulerServiceData {
17278
+ /** Service name (e.g. "Haircut", "Oil change"). */
17279
+ serviceName: string;
17280
+ /** Person providing the service. */
17281
+ providerName?: string;
17282
+ /** Customer name. */
17283
+ customerName?: string;
17284
+ /** Customer phone / email. */
17285
+ customerContact?: string;
17286
+ /** Location / address. */
17287
+ location?: string;
17288
+ /** Price (numeric). */
17289
+ price?: number;
17290
+ /** Currency code (ISO 4217), defaults to display-only "PLN". */
17291
+ currency?: string;
17292
+ /** Free-form notes. */
17293
+ notes?: string;
17294
+ }
17295
+
16532
17296
  /** Available calendar views for the {@link NiceScheduler}. */
16533
17297
  export declare type NiceSchedulerView = 'day' | 'week' | 'workWeek' | 'month' | 'dayRange' | 'monthRange' | 'agenda' | 'timeline';
16534
17298
 
@@ -16550,6 +17314,77 @@ export declare interface NiceScrollViewProps extends NiceBaseProps {
16550
17314
  children?: default_2.ReactNode;
16551
17315
  }
16552
17316
 
17317
+ export declare const NiceSearchBar: default_2.ForwardRefExoticComponent<NiceSearchBarProps & default_2.RefAttributes<NiceSearchBarHandle>>;
17318
+
17319
+ export declare type NiceSearchBarExpandDirection = 'left' | 'right' | 'down';
17320
+
17321
+ export declare interface NiceSearchBarHandle {
17322
+ focus: () => void;
17323
+ expand: () => void;
17324
+ collapse: () => void;
17325
+ clear: () => void;
17326
+ }
17327
+
17328
+ export declare interface NiceSearchBarProps {
17329
+ /** Controlled value. */
17330
+ value?: string;
17331
+ /** Default value (uncontrolled). */
17332
+ defaultValue?: string;
17333
+ /** Change handler. */
17334
+ onChange?: (value: string) => void;
17335
+ /** Submit handler — fires on Enter. */
17336
+ onSubmit?: (value: string) => void;
17337
+ /** Clear handler — fires when ✕ is clicked or Escape pressed with non-empty value. */
17338
+ onClear?: () => void;
17339
+ /** Placeholder text (defaults to translated "Search…"). */
17340
+ placeholder?: string;
17341
+ /**
17342
+ * If true, the bar starts already expanded and stays so unless `collapsible`
17343
+ * is also true. Default: `false`.
17344
+ */
17345
+ defaultExpanded?: boolean;
17346
+ /**
17347
+ * Controlled expanded flag. When provided, takes priority over the
17348
+ * internal state.
17349
+ */
17350
+ expanded?: boolean;
17351
+ /** Notified whenever the expanded state changes. */
17352
+ onExpandedChange?: (expanded: boolean) => void;
17353
+ /**
17354
+ * Allow the bar to collapse. Default: `true` when no `expanded` is given.
17355
+ * Set to `false` to render an always-expanded plain search input.
17356
+ */
17357
+ collapsible?: boolean;
17358
+ /**
17359
+ * Direction the input grows when expanding from the icon-button.
17360
+ * Default: `'left'` (suitable for top-nav right cluster).
17361
+ */
17362
+ expandDirection?: NiceSearchBarExpandDirection;
17363
+ /**
17364
+ * Maximum width of the expanded input (px). Default: `260`.
17365
+ * On narrow screens caps automatically at `100vw - 32px`.
17366
+ */
17367
+ expandWidth?: number;
17368
+ /**
17369
+ * Auto-collapse when the input loses focus AND is empty. Default: `true`.
17370
+ */
17371
+ autoCollapseOnBlur?: boolean;
17372
+ /** Size variant. */
17373
+ size?: NiceSearchBarSize;
17374
+ /** Custom search icon. Default: 🔍 (will use NiceIcon when wired by host). */
17375
+ icon?: default_2.ReactNode;
17376
+ /** Disable the control. */
17377
+ disabled?: boolean;
17378
+ /** Accessible label. */
17379
+ ariaLabel?: string;
17380
+ className?: string;
17381
+ style?: default_2.CSSProperties;
17382
+ id?: string;
17383
+ 'data-testid'?: string;
17384
+ }
17385
+
17386
+ export declare type NiceSearchBarSize = 'sm' | 'md' | 'lg';
17387
+
16553
17388
  /**
16554
17389
  * `NiceSegmentedControl` — single-selection toggle group with an animated
16555
17390
  * sliding "thumb" highlight, iOS-style. The control owns a single value
@@ -16806,10 +17641,36 @@ export declare interface NiceSidebarNavProps {
16806
17641
  onPreferencesChange?: (prefs: SidebarNavUserPrefs) => void;
16807
17642
  /** Sidebar width in px (default: 264) */
16808
17643
  width?: number;
17644
+ /** Sidebar width in px when collapsed/icon-only (default: 56). */
17645
+ collapsedWidth?: number;
17646
+ /**
17647
+ * Which side of the screen the sidebar is anchored to. Default `'left'`.
17648
+ * `'right'` flips the chevron direction and pushes the footer-toggle to the
17649
+ * left edge — useful for RTL or right-side admin shells.
17650
+ */
17651
+ position?: 'left' | 'right';
17652
+ /**
17653
+ * **Minimal mode** — hides the mode strip, sources, favorites and footer
17654
+ * preferences, leaving only the navigation tree. Use for stripped-down
17655
+ * shells (auth flows, embedded views) where the full taxonomy is overkill.
17656
+ * Default `false`.
17657
+ */
17658
+ minimal?: boolean;
17659
+ /** Optional header slot rendered above the mode strip / tree (e.g. workspace switcher). */
17660
+ header?: ReactNode;
17661
+ /** Optional footer slot rendered below the standard footer-toggle row. */
17662
+ footerExtra?: ReactNode;
16809
17663
  /** Collapsed (icon-only) mode */
16810
17664
  collapsed?: boolean;
16811
17665
  /** Called when collapsed state changes (for toggle button) */
16812
17666
  onCollapsedChange?: (collapsed: boolean) => void;
17667
+ /**
17668
+ * When `true` (default), users can still expand/collapse module branches
17669
+ * even while the sidebar itself is in icon-only collapsed mode (chevrons
17670
+ * stay visible). When `false`, all branches are forced flat / always-open
17671
+ * in collapsed mode (legacy behaviour).
17672
+ */
17673
+ expandableWhenCollapsed?: boolean;
16813
17674
  /** Extra CSS class on the root element */
16814
17675
  className?: string;
16815
17676
  /** Size variant */
@@ -18104,14 +18965,32 @@ export declare interface NiceThemePickerProps extends NiceFormFieldProps, DualVi
18104
18965
  defaultValue?: string;
18105
18966
  /** Callback when selection changes */
18106
18967
  onChange?: (theme: NiceThemeDescriptor | null) => void;
18107
- /** Available themes (required — picker is dumb on its own). */
18108
- themes: NiceThemeDescriptor[];
18968
+ /**
18969
+ * Available themes. Defaults to {@link NICE_THEME_PICKER_PRESETS} (all
18970
+ * built-in presets adapted from {@link NICE_THEME_PRESETS}). Pass an
18971
+ * explicit array to override or to add custom themes alongside the presets.
18972
+ *
18973
+ * Note: passing `[]` will produce an empty dropdown and emit a dev-mode
18974
+ * warning. Omit the prop entirely to fall back to the built-in presets.
18975
+ */
18976
+ themes?: NiceThemeDescriptor[];
18109
18977
  /** Placeholder shown when nothing is selected (ignored in compact mode). */
18110
18978
  placeholder?: string;
18111
18979
  /** Enable search */
18112
18980
  showSearch?: boolean;
18113
- /** Search placeholder */
18981
+ /**
18982
+ * Threshold below which the internal search/filter input is hidden even
18983
+ * when `showSearch` is `true`. Prevents a noisy filter UI for short lists
18984
+ * (e.g. 6 themes). Default: `8`. Set `0` to always show, `Infinity` to
18985
+ * always hide.
18986
+ */
18987
+ searchThreshold?: number;
18988
+ /** Search placeholder. Default: translated `'Filter themes…'`. */
18114
18989
  searchPlaceholder?: string;
18990
+ /** Controlled open state (for coordinating with sibling controls). */
18991
+ isOpen?: boolean;
18992
+ /** Notified whenever the dropdown open state changes. */
18993
+ onOpenChange?: (open: boolean) => void;
18115
18994
  /** Show preview thumbnail in trigger. Default: true */
18116
18995
  showPreviewInValue?: boolean;
18117
18996
  /** Show preview thumbnail in dropdown options. Default: true */
@@ -18460,6 +19339,245 @@ export declare interface NiceTooltipProps {
18460
19339
  children: default_2.ReactElement;
18461
19340
  }
18462
19341
 
19342
+ export declare const NiceTopNav: default_2.ForwardRefExoticComponent<NiceTopNavProps & default_2.RefAttributes<HTMLElement>>;
19343
+
19344
+ export declare type NiceTopNavDensity = 'compact' | 'normal' | 'comfortable';
19345
+
19346
+ /**
19347
+ * Optional extra round icon-button shown in the right cluster
19348
+ * (e.g. settings gear). When `menuItems` is provided, clicking the
19349
+ * button opens a small dropdown menu; otherwise `onClick` fires.
19350
+ *
19351
+ * Added in v1.0.10 to satisfy customizable user-button cluster
19352
+ * feedback for {@link NiceTopNav}.
19353
+ */
19354
+ declare interface NiceTopNavExtraAction {
19355
+ id: string;
19356
+ label: string;
19357
+ icon: default_2.ReactNode;
19358
+ onClick?: () => void;
19359
+ menuItems?: UserMenuItem[];
19360
+ /** Optional badge / dot. */
19361
+ badge?: number | string;
19362
+ }
19363
+
19364
+ /** @deprecated v2 nav-item type. Prefer {@link NiceNavMenuItem} via `navMenuItems`. */
19365
+ export declare interface NiceTopNavItem {
19366
+ id: string;
19367
+ label: string;
19368
+ icon?: default_2.ReactNode;
19369
+ href?: string;
19370
+ onClick?: () => void;
19371
+ }
19372
+
19373
+ /** @deprecated v2 language type. Prefer `<NiceLanguagePicker>` props. */
19374
+ export declare interface NiceTopNavLanguageOption {
19375
+ code: string;
19376
+ label: string;
19377
+ flag?: default_2.ReactNode;
19378
+ }
19379
+
19380
+ /** @deprecated v2 user-menu item. Prefer {@link UserMenuItem}. */
19381
+ export declare interface NiceTopNavMenuItem {
19382
+ id: string;
19383
+ label: string;
19384
+ icon?: default_2.ReactNode;
19385
+ onClick?: () => void;
19386
+ divider?: boolean;
19387
+ href?: string;
19388
+ }
19389
+
19390
+ export declare interface NiceTopNavProps {
19391
+ height?: number | string;
19392
+ density?: NiceTopNavDensity;
19393
+ maxWidth?: number | string;
19394
+ paddingX?: number | string;
19395
+ gap?: number | string;
19396
+ borderBottom?: boolean;
19397
+ elevated?: boolean;
19398
+ sticky?: boolean;
19399
+ variant?: NiceTopNavVariant;
19400
+ accentBar?: boolean;
19401
+ accentBarColor?: string;
19402
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
19403
+ /**
19404
+ * Visual state — mirrors the standard control state contract used across
19405
+ * basic Nice2Dev controls (input, button). Defaults to `'normal'`.
19406
+ * - `loading` — renders a subtle shimmer overlay; bar remains interactive.
19407
+ * - `error` — accents the bottom border with `--color-danger`.
19408
+ * - `disabled` — dims the bar and disables pointer events.
19409
+ */
19410
+ state?: 'normal' | 'loading' | 'error' | 'disabled';
19411
+ /**
19412
+ * Compact mode — collapses brand name, hides labels on icon-only actions,
19413
+ * tightens paddings. Combine with `size='sm'` for an ultra-dense bar.
19414
+ */
19415
+ compact?: boolean;
19416
+ collapsible?: boolean;
19417
+ collapsed?: boolean;
19418
+ onCollapsedChange?: (collapsed: boolean) => void;
19419
+ /**
19420
+ * Bar height when collapsed. Defaults to `32` so the entire bar content
19421
+ * (brand, nav menu, search, pickers, notifications, user menu) stays
19422
+ * visible — proportionally scaled down via {@link collapsedContentScale}.
19423
+ * Lower values produce an almost-hidden strip; raise for more breathing
19424
+ * room around shrunk controls.
19425
+ */
19426
+ collapsedHeight?: number | string;
19427
+ /**
19428
+ * Scale factor (0–1) applied to the logo / brand name while collapsed.
19429
+ * Default `0.5`. Affects only the brand block; use
19430
+ * {@link collapsedContentScale} to scale the rest of the bar.
19431
+ */
19432
+ collapsedLogoScale?: number;
19433
+ /**
19434
+ * Scale factor (0–1) applied to the whole inner row (nav menu, search,
19435
+ * pickers, notifications, user menu, collapse button) while collapsed.
19436
+ * The bar shows ALL of its content — just very small — so users keep
19437
+ * full functionality on a slim strip. Default `0.55`.
19438
+ */
19439
+ collapsedContentScale?: number;
19440
+ hideOnScroll?: boolean;
19441
+ scrollThreshold?: number;
19442
+ logo?: default_2.ReactNode;
19443
+ brandName?: string;
19444
+ brandHref?: string;
19445
+ onBrandClick?: () => void;
19446
+ logoVariant?: NiceLogoVariant;
19447
+ logoSize?: NiceLogoSize;
19448
+ /**
19449
+ * Brand block alignment within the bar. Combined with {@link navAlignment}
19450
+ * gives 9 possible layouts. Default `'left'`.
19451
+ *
19452
+ * - `'left'` — brand sits at the very start of the bar (classic).
19453
+ * - `'center'` — brand is centered (use with `navAlignment='start'` for
19454
+ * a Bootstrap-style centered logo).
19455
+ * - `'right'` — brand sits at the end (rare, useful for RTL or unusual layouts).
19456
+ */
19457
+ brandAlign?: 'left' | 'center' | 'right';
19458
+ /**
19459
+ * Pre-baked configuration profile. Sets sensible defaults for several props
19460
+ * at once so a one-line `<NiceTopNav preset="marketing" />` ships a polished
19461
+ * bar. Any explicit prop overrides the preset's default.
19462
+ *
19463
+ * - `'marketing'` — landing-page bar: brand left, nav center, login/register
19464
+ * right, no search, no pickers, accent bar on, sticky.
19465
+ * - `'saas'` — admin/SaaS bar: brand left, nav left, full toolbar
19466
+ * (search + lang + theme + notifications + user menu),
19467
+ * collapsible right cluster opens by default, settings
19468
+ * gear after the avatar.
19469
+ * - `'docs'` — documentation bar: brand left, nav left, prominent
19470
+ * always-expanded search (max 500px), theme picker only.
19471
+ * - `'minimal'` — bare brand bar: brand only, no nav, no right cluster.
19472
+ */
19473
+ preset?: 'marketing' | 'saas' | 'docs' | 'minimal';
19474
+ navItems?: NiceTopNavItem[];
19475
+ navMenuItems?: NiceNavMenuItem[];
19476
+ activeNavId?: string;
19477
+ navAlignment?: 'start' | 'center' | 'end';
19478
+ /**
19479
+ * How mega-menu items in `navMenuItems` open. Default `'hover'` (classical
19480
+ * desktop pattern). Switch to `'click'` for touch-first sites. Only applies
19481
+ * when at least one nav item carries `megaPanel` or `megaColumns`.
19482
+ */
19483
+ megaTrigger?: 'hover' | 'click';
19484
+ mobileBreakpoint?: number;
19485
+ /**
19486
+ * How navigation behaves below `mobileBreakpoint`:
19487
+ * - `hamburger` (default) — collapse to hamburger button + drawer.
19488
+ * - `wrap` — let nav items wrap onto a second row.
19489
+ * - `scroll` — keep nav inline; horizontally scroll-snap overflowed items.
19490
+ */
19491
+ mobileVariant?: 'hamburger' | 'wrap' | 'scroll';
19492
+ searchPlaceholder?: string;
19493
+ searchValue?: string;
19494
+ onSearchChange?: (value: string) => void;
19495
+ onSearchSubmit?: (value: string) => void;
19496
+ collapsibleSearch?: boolean;
19497
+ searchCollapsible?: boolean;
19498
+ searchExpandDirection?: NiceSearchBarExpandDirection;
19499
+ searchExpandWidth?: number;
19500
+ searchBarProps?: Partial<NiceSearchBarProps>;
19501
+ centerContent?: default_2.ReactNode;
19502
+ /** Toggle search visibility independently of search props presence. Default: derived from search props. */
19503
+ showSearch?: boolean;
19504
+ languages?: NiceTopNavLanguageOption[];
19505
+ currentLanguage?: string;
19506
+ onLanguageChange?: (code: string) => void;
19507
+ showLanguagePicker?: boolean;
19508
+ languagePickerProps?: Partial<NiceLanguagePickerProps>;
19509
+ themes?: NiceTopNavThemeOption[];
19510
+ currentTheme?: string;
19511
+ onThemeChange?: (id: string) => void;
19512
+ showThemePicker?: boolean;
19513
+ themePickerProps?: Partial<NiceThemePickerProps>;
19514
+ notificationsCount?: number;
19515
+ onNotificationsClick?: () => void;
19516
+ notifications?: NiceNotificationItem[];
19517
+ onMarkAllNotificationsRead?: () => void;
19518
+ /** Toggle notifications visibility independently of notification props presence. */
19519
+ showNotifications?: boolean;
19520
+ user?: NiceTopNavUser | NiceAuthUser;
19521
+ userMenuItems?: UserMenuItem[];
19522
+ /** @deprecated Use `userMenuItems`. */
19523
+ userMenu?: NiceTopNavMenuItem[];
19524
+ onProfile?: () => void;
19525
+ onLogout?: () => void;
19526
+ showLogin?: boolean;
19527
+ loginLabel?: string;
19528
+ onLoginClick?: () => void;
19529
+ showRegister?: boolean;
19530
+ registerLabel?: string;
19531
+ onRegisterClick?: () => void;
19532
+ /**
19533
+ * Extra round icon-buttons rendered right before the auth/user-menu cluster.
19534
+ * Each entry can either fire `onClick` directly or open a small dropdown
19535
+ * (`menuItems`). Use this to add a customizable settings gear / quick actions
19536
+ * without forking {@link NiceAuthButtons}.
19537
+ */
19538
+ extraActions?: NiceTopNavExtraAction[];
19539
+ /** Show a built-in settings gear (uses inline Ntd-style cog SVG). */
19540
+ showSettings?: boolean;
19541
+ /** Settings click handler — used when `settingsMenuItems` is empty. */
19542
+ onSettingsClick?: () => void;
19543
+ /** Optional dropdown items shown when the settings gear is clicked. */
19544
+ settingsMenuItems?: UserMenuItem[];
19545
+ /** Settings button aria-label / tooltip. */
19546
+ settingsLabel?: string;
19547
+ /**
19548
+ * Wrap search + language + theme pickers in a collapsible cluster with a
19549
+ * chevron toggle. When `true` (default), the cluster starts collapsed and
19550
+ * expands to the LEFT on click — saves horizontal space and prevents the
19551
+ * navigation menu from overlapping the right toolbar. Set to `false` to
19552
+ * always render the pickers inline.
19553
+ */
19554
+ collapsibleRightCluster?: boolean;
19555
+ /** Initial open state of the collapsible cluster. Default `false`. */
19556
+ rightClusterDefaultOpen?: boolean;
19557
+ leftContent?: default_2.ReactNode;
19558
+ rightContent?: default_2.ReactNode;
19559
+ className?: string;
19560
+ style?: default_2.CSSProperties;
19561
+ id?: string;
19562
+ 'data-testid'?: string;
19563
+ }
19564
+
19565
+ /** @deprecated v2 theme type. Prefer `<NiceThemePicker>` props. */
19566
+ export declare interface NiceTopNavThemeOption {
19567
+ id: string;
19568
+ label: string;
19569
+ icon?: default_2.ReactNode;
19570
+ }
19571
+
19572
+ /** @deprecated v2 user type. Prefer {@link NiceAuthUser}. */
19573
+ export declare interface NiceTopNavUser {
19574
+ name: string;
19575
+ avatarUrl?: string;
19576
+ initials?: string;
19577
+ }
19578
+
19579
+ export declare type NiceTopNavVariant = 'default' | 'primary' | 'accent' | 'transparent' | 'glass' | 'dark';
19580
+
18463
19581
  export declare interface NiceTopologyData {
18464
19582
  links: Array<{
18465
19583
  sourceId: string;
@@ -21226,6 +22344,9 @@ export declare interface RealtimeDataPoint {
21226
22344
  label?: string;
21227
22345
  }
21228
22346
 
22347
+ /** Total time = prep + cook (minutes), or undefined if neither provided. */
22348
+ export declare function recipeTotalMinutes(recipe: NiceRecipeModel): number | undefined;
22349
+
21229
22350
  /**
21230
22351
  * Reconciliation view configuration.
21231
22352
  */
@@ -22266,7 +23387,7 @@ export declare interface SidebarNavDataNode {
22266
23387
  export declare interface SidebarNavDataSource {
22267
23388
  id: string;
22268
23389
  label: string;
22269
- icon?: string;
23390
+ icon?: ReactNode;
22270
23391
  color?: string;
22271
23392
  /** Server URL or connection string hint */
22272
23393
  url?: string;
@@ -22277,7 +23398,7 @@ export declare interface SidebarNavDataSource {
22277
23398
  export declare interface SidebarNavFavorite {
22278
23399
  id: string;
22279
23400
  label: string;
22280
- icon?: string;
23401
+ icon?: ReactNode;
22281
23402
  route?: string;
22282
23403
  sourceId?: string;
22283
23404
  moduleId?: string;
@@ -22300,7 +23421,7 @@ export declare type SidebarNavMode = 'all' | 'by-role' | 'by-unit' | 'favorites'
22300
23421
  export declare interface SidebarNavModule {
22301
23422
  id: string;
22302
23423
  label: string;
22303
- icon?: string;
23424
+ icon?: ReactNode;
22304
23425
  views: SidebarNavView[];
22305
23426
  /** Source this module belongs to */
22306
23427
  sourceId?: string;
@@ -22310,7 +23431,7 @@ export declare interface SidebarNavModule {
22310
23431
  export declare interface SidebarNavRole {
22311
23432
  id: string;
22312
23433
  label: string;
22313
- icon?: string;
23434
+ icon?: ReactNode;
22314
23435
  modules: SidebarNavModule[];
22315
23436
  /** Source this role belongs to */
22316
23437
  sourceId?: string;
@@ -22320,7 +23441,7 @@ export declare interface SidebarNavRole {
22320
23441
  export declare interface SidebarNavUnit {
22321
23442
  id: string;
22322
23443
  label: string;
22323
- icon?: string;
23444
+ icon?: ReactNode;
22324
23445
  modules: SidebarNavModule[];
22325
23446
  /** Source this unit belongs to */
22326
23447
  sourceId?: string;
@@ -22357,7 +23478,7 @@ export declare interface SidebarNavUserPrefs {
22357
23478
  export declare interface SidebarNavView {
22358
23479
  id: string;
22359
23480
  label: string;
22360
- icon?: string;
23481
+ icon?: ReactNode;
22361
23482
  /** Route path for navigation */
22362
23483
  route?: string;
22363
23484
  /** Badge counter (unread notifications, pending tasks, …) */
@@ -22427,6 +23548,8 @@ declare interface SliderConfig {
22427
23548
  format?: (value: number) => string;
22428
23549
  }
22429
23550
 
23551
+ declare type Slot = ReactNode | ((api: NiceNavShellApi) => ReactNode);
23552
+
22430
23553
  export declare interface SmartDeviceDto {
22431
23554
  id: string;
22432
23555
  name: string;
@@ -23583,6 +24706,25 @@ declare interface TooltipData {
23583
24706
 
23584
24707
  export { TooltipStyleVariant }
23585
24708
 
24709
+ /**
24710
+ * Adapts a full {@link NiceTheme} into the lightweight
24711
+ * {@link NiceThemeDescriptor} shape consumed by `<NiceThemePicker>`.
24712
+ *
24713
+ * The `id` is the theme name (stable identifier across renders); the
24714
+ * `preview` colours feed the mini page-thumbnail rendered in the trigger
24715
+ * and dropdown options.
24716
+ *
24717
+ * @example
24718
+ * ```tsx
24719
+ * import { NICE_THEME_PRESETS } from '@nice2dev/ui';
24720
+ * import { toThemeDescriptor } from '@nice2dev/ui';
24721
+ *
24722
+ * const themes = NICE_THEME_PRESETS.map(toThemeDescriptor);
24723
+ * <NiceThemePicker themes={themes} value={current} onChange={...} />
24724
+ * ```
24725
+ */
24726
+ export declare function toThemeDescriptor(theme: NiceTheme): NiceThemeDescriptor;
24727
+
23586
24728
  export { TouchPoint }
23587
24729
 
23588
24730
  export { TouchTargetProps }