@nim.zone/ui 0.6.0

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 (129) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +681 -0
  3. package/dist/components/admin-shell.d.ts +121 -0
  4. package/dist/components/app-shell.d.ts +23 -0
  5. package/dist/components/auth-screen.d.ts +33 -0
  6. package/dist/components/avatar.d.ts +10 -0
  7. package/dist/components/badge.d.ts +14 -0
  8. package/dist/components/banner.d.ts +11 -0
  9. package/dist/components/breadcrumb.d.ts +12 -0
  10. package/dist/components/button.d.ts +21 -0
  11. package/dist/components/card.d.ts +15 -0
  12. package/dist/components/chat-composer.d.ts +52 -0
  13. package/dist/components/chat.d.ts +77 -0
  14. package/dist/components/checkout.d.ts +79 -0
  15. package/dist/components/choice.d.ts +15 -0
  16. package/dist/components/combobox.d.ts +31 -0
  17. package/dist/components/date-field.d.ts +58 -0
  18. package/dist/components/dialog.d.ts +20 -0
  19. package/dist/components/empty-state.d.ts +9 -0
  20. package/dist/components/feedback.d.ts +18 -0
  21. package/dist/components/field.d.ts +47 -0
  22. package/dist/components/icon-button.d.ts +12 -0
  23. package/dist/components/icon.d.ts +72 -0
  24. package/dist/components/layout.d.ts +13 -0
  25. package/dist/components/list.d.ts +16 -0
  26. package/dist/components/menu.d.ts +56 -0
  27. package/dist/components/onboarding.d.ts +50 -0
  28. package/dist/components/otp-input.d.ts +29 -0
  29. package/dist/components/pagination.d.ts +12 -0
  30. package/dist/components/password-field.d.ts +33 -0
  31. package/dist/components/phone-field.d.ts +44 -0
  32. package/dist/components/plan-card.d.ts +45 -0
  33. package/dist/components/plan-picker.d.ts +52 -0
  34. package/dist/components/profile-header.d.ts +47 -0
  35. package/dist/components/profile-screen.d.ts +44 -0
  36. package/dist/components/resource-meter.d.ts +22 -0
  37. package/dist/components/section-header.d.ts +8 -0
  38. package/dist/components/segmented.d.ts +18 -0
  39. package/dist/components/sheet.d.ts +18 -0
  40. package/dist/components/sign-in-flow.d.ts +60 -0
  41. package/dist/components/slider.d.ts +10 -0
  42. package/dist/components/stat.d.ts +10 -0
  43. package/dist/components/stepper.d.ts +17 -0
  44. package/dist/components/tab-bar.d.ts +40 -0
  45. package/dist/components/table.d.ts +33 -0
  46. package/dist/components/tabs.d.ts +23 -0
  47. package/dist/components/task-progress.d.ts +38 -0
  48. package/dist/components/theme.d.ts +49 -0
  49. package/dist/components/toast.d.ts +17 -0
  50. package/dist/components/tooltip.d.ts +18 -0
  51. package/dist/components/typography.d.ts +18 -0
  52. package/dist/components/wizard.d.ts +70 -0
  53. package/dist/index.d.ts +104 -0
  54. package/dist/lib/calendars.d.ts +81 -0
  55. package/dist/lib/cn.d.ts +7 -0
  56. package/dist/lib/countries.d.ts +33 -0
  57. package/dist/lib/use-anchor.d.ts +22 -0
  58. package/dist/nim.css +1 -0
  59. package/dist/nim.js +3266 -0
  60. package/package.json +83 -0
  61. package/src/components/admin-shell.tsx +338 -0
  62. package/src/components/app-shell.tsx +36 -0
  63. package/src/components/auth-screen.tsx +71 -0
  64. package/src/components/avatar.tsx +32 -0
  65. package/src/components/badge.tsx +44 -0
  66. package/src/components/banner.tsx +47 -0
  67. package/src/components/breadcrumb.tsx +45 -0
  68. package/src/components/button.tsx +64 -0
  69. package/src/components/card.tsx +46 -0
  70. package/src/components/chat-composer.tsx +331 -0
  71. package/src/components/chat.tsx +352 -0
  72. package/src/components/checkout.tsx +173 -0
  73. package/src/components/choice.tsx +46 -0
  74. package/src/components/combobox.tsx +157 -0
  75. package/src/components/date-field.tsx +394 -0
  76. package/src/components/dialog.tsx +77 -0
  77. package/src/components/empty-state.tsx +23 -0
  78. package/src/components/feedback.tsx +61 -0
  79. package/src/components/field.tsx +177 -0
  80. package/src/components/icon-button.tsx +35 -0
  81. package/src/components/icon.tsx +167 -0
  82. package/src/components/layout.tsx +38 -0
  83. package/src/components/list.tsx +78 -0
  84. package/src/components/menu.tsx +172 -0
  85. package/src/components/onboarding.tsx +157 -0
  86. package/src/components/otp-input.tsx +144 -0
  87. package/src/components/pagination.tsx +86 -0
  88. package/src/components/password-field.tsx +112 -0
  89. package/src/components/phone-field.tsx +242 -0
  90. package/src/components/plan-card.tsx +124 -0
  91. package/src/components/plan-picker.tsx +144 -0
  92. package/src/components/profile-header.tsx +134 -0
  93. package/src/components/profile-screen.tsx +104 -0
  94. package/src/components/resource-meter.tsx +60 -0
  95. package/src/components/section-header.tsx +31 -0
  96. package/src/components/segmented.tsx +53 -0
  97. package/src/components/sheet.tsx +74 -0
  98. package/src/components/sign-in-flow.tsx +322 -0
  99. package/src/components/slider.tsx +50 -0
  100. package/src/components/stat.tsx +30 -0
  101. package/src/components/stepper.tsx +77 -0
  102. package/src/components/tab-bar.tsx +82 -0
  103. package/src/components/table.tsx +81 -0
  104. package/src/components/tabs.tsx +72 -0
  105. package/src/components/task-progress.tsx +111 -0
  106. package/src/components/theme.tsx +112 -0
  107. package/src/components/toast.tsx +87 -0
  108. package/src/components/tooltip.tsx +30 -0
  109. package/src/components/typography.tsx +65 -0
  110. package/src/components/wizard.tsx +192 -0
  111. package/src/index.ts +216 -0
  112. package/src/lib/calendars.ts +227 -0
  113. package/src/lib/cn.ts +8 -0
  114. package/src/lib/countries.ts +110 -0
  115. package/src/lib/use-anchor.ts +92 -0
  116. package/src/theme/colorways/coral.css +62 -0
  117. package/src/theme/colorways/oxblood.css +23 -0
  118. package/src/theme/colorways/paper.css +68 -0
  119. package/src/theme/colorways/teal.css +56 -0
  120. package/src/theme/colorways/vermilion.css +21 -0
  121. package/src/theme/components.css +4606 -0
  122. package/src/theme/contract.css +204 -0
  123. package/src/theme/fonts.css +67 -0
  124. package/src/theme/index.css +33 -0
  125. package/src/theme/persian.css +47 -0
  126. package/src/theme/reset.css +118 -0
  127. package/src/theme/styles/ledger.css +106 -0
  128. package/src/theme/styles/vlora.css +91 -0
  129. package/src/vite-env.d.ts +1 -0
@@ -0,0 +1,65 @@
1
+ import type { ElementType, HTMLAttributes, ReactNode } from 'react'
2
+ import { cn } from '@/lib/cn'
3
+
4
+ interface TextProps extends HTMLAttributes<HTMLElement> {
5
+ as?: ElementType
6
+ children: ReactNode
7
+ }
8
+
9
+ /** The largest role: page-opening statements only, one per screen. */
10
+ export function Display({ as: Component = 'h1', children, className, ...props }: TextProps) {
11
+ return (
12
+ <Component className={cn('nim-display', className)} {...props}>
13
+ {children}
14
+ </Component>
15
+ )
16
+ }
17
+
18
+ export function Title({
19
+ as: Component = 'h2',
20
+ children,
21
+ className,
22
+ size = 'lg',
23
+ ...props
24
+ }: TextProps & { size?: 'lg' | 'md' }) {
25
+ return (
26
+ <Component className={cn('nim-title', size === 'md' && 'nim-title--md', className)} {...props}>
27
+ {children}
28
+ </Component>
29
+ )
30
+ }
31
+
32
+ export function Body({
33
+ as: Component = 'p',
34
+ children,
35
+ className,
36
+ size = 'md',
37
+ ...props
38
+ }: TextProps & { size?: 'md' | 'sm' }) {
39
+ return (
40
+ <Component className={cn('nim-body', size === 'sm' && 'nim-body--sm', className)} {...props}>
41
+ {children}
42
+ </Component>
43
+ )
44
+ }
45
+
46
+ /** Mono/uppercase in Ledger, sentence case in Vlora — the theme decides. */
47
+ export function Label({ as: Component = 'span', children, className, ...props }: TextProps) {
48
+ return (
49
+ <Component className={cn('nim-label', className)} {...props}>
50
+ {children}
51
+ </Component>
52
+ )
53
+ }
54
+
55
+ export function Caption({ as: Component = 'p', children, className, ...props }: TextProps) {
56
+ return (
57
+ <Component className={cn('nim-caption', className)} {...props}>
58
+ {children}
59
+ </Component>
60
+ )
61
+ }
62
+
63
+ export function Rule({ className, ...props }: HTMLAttributes<HTMLHRElement>) {
64
+ return <hr className={cn('nim-rule', className)} {...props} />
65
+ }
@@ -0,0 +1,192 @@
1
+ import { useCallback, useState } from 'react'
2
+ import type { ReactNode } from 'react'
3
+ import { Button } from '@/components/button'
4
+ import { IconButton } from '@/components/icon-button'
5
+ import { cn } from '@/lib/cn'
6
+
7
+ export interface WizardStep {
8
+ /** The step itself. A function receives nothing — the caller already holds
9
+ the answers, because they are the app's, not the wizard's. */
10
+ content: ReactNode
11
+ /** Blocks the CTA until the step is answered. */
12
+ canContinue?: boolean
13
+ /** Overrides the CTA label on this step alone. */
14
+ continueLabel?: string
15
+ id: string
16
+ /** The one thing being asked. Kept short: a wizard step is a question. */
17
+ question?: ReactNode
18
+ subtitle?: ReactNode
19
+ }
20
+
21
+ export interface WizardProps {
22
+ className?: string
23
+ continueLabel: string
24
+ /** Label on the last step. */
25
+ finishLabel: string
26
+ labels?: { back: string; close: string; step: (index: number, total: number) => string }
27
+ onClose?: () => void
28
+ /** Fired from the last step's CTA. */
29
+ onDone: () => void
30
+ /** Every step change, including backwards — for analytics and autosave. */
31
+ onStep?: (index: number) => void
32
+ steps: WizardStep[]
33
+ }
34
+
35
+ const DEFAULT_LABELS = {
36
+ back: 'Back',
37
+ close: 'Close',
38
+ step: (index: number, total: number) => `Step ${index + 1} of ${total}`,
39
+ }
40
+
41
+ /**
42
+ * A short, one-question-per-screen flow: mood → cause → note, or any other
43
+ * sequence a viewer walks once and abandons easily.
44
+ *
45
+ * The step index is the wizard's; the answers are not. A wizard that owned the
46
+ * answers would have to know their shape, and every product's are different —
47
+ * so each step is given its content and reports back through `canContinue`,
48
+ * which is the only thing the shell needs to know.
49
+ *
50
+ * Progress is dots rather than a bar: a bar implies a percentage of work done,
51
+ * and three questions are three questions. The close control is always present
52
+ * — a flow the viewer cannot leave is a trap, and leaving is the most common
53
+ * thing anyone does with one of these.
54
+ */
55
+ export function Wizard({
56
+ className,
57
+ continueLabel,
58
+ finishLabel,
59
+ labels,
60
+ onClose,
61
+ onDone,
62
+ onStep,
63
+ steps,
64
+ }: WizardProps) {
65
+ const text = { ...DEFAULT_LABELS, ...labels }
66
+ const [index, setIndex] = useState(0)
67
+ const step = steps[Math.min(index, steps.length - 1)]
68
+ const last = index === steps.length - 1
69
+
70
+ const goTo = useCallback(
71
+ (next: number) => {
72
+ setIndex(next)
73
+ onStep?.(next)
74
+ },
75
+ [onStep],
76
+ )
77
+
78
+ return (
79
+ <section className={cn('nim-wizard', className)}>
80
+ <header className="nim-wizard__bar">
81
+ <span className="nim-wizard__slot">
82
+ {index > 0 ? (
83
+ <IconButton label={text.back} name="chevron-back" onClick={() => goTo(index - 1)} size="sm" />
84
+ ) : null}
85
+ </span>
86
+
87
+ <ol aria-label={text.step(index, steps.length)} className="nim-wizard__dots">
88
+ {steps.map((item, dot) => (
89
+ <li
90
+ className="nim-wizard__dot"
91
+ data-done={dot < index ? 'true' : undefined}
92
+ data-on={dot === index ? 'true' : undefined}
93
+ key={item.id}
94
+ />
95
+ ))}
96
+ </ol>
97
+
98
+ <span className="nim-wizard__slot">
99
+ {onClose ? <IconButton label={text.close} name="close" onClick={onClose} size="sm" /> : null}
100
+ </span>
101
+ </header>
102
+
103
+ {step.question ? (
104
+ <div className="nim-wizard__ask">
105
+ <h1 className="nim-wizard__question">{step.question}</h1>
106
+ {step.subtitle ? <p className="nim-wizard__subtitle">{step.subtitle}</p> : null}
107
+ </div>
108
+ ) : null}
109
+
110
+ <div className="nim-wizard__content">{step.content}</div>
111
+
112
+ <footer className="nim-wizard__foot">
113
+ <Button
114
+ disabled={step.canContinue === false}
115
+ fullWidth
116
+ onClick={() => (last ? onDone() : goTo(index + 1))}
117
+ size="lg"
118
+ variant="accent"
119
+ >
120
+ {step.continueLabel ?? (last ? finishLabel : continueLabel)}
121
+ </Button>
122
+ </footer>
123
+ </section>
124
+ )
125
+ }
126
+
127
+ export interface ChoiceGridOption {
128
+ disabled?: boolean
129
+ icon?: ReactNode
130
+ id: string
131
+ label: ReactNode
132
+ }
133
+
134
+ export interface ChoiceGridProps {
135
+ className?: string
136
+ /** Cap a multi-select. Options past the cap disable rather than disappear,
137
+ so the grid does not reflow under the viewer's finger. */
138
+ max?: number
139
+ multiple?: boolean
140
+ onChange: (selected: string[]) => void
141
+ options: ChoiceGridOption[]
142
+ selected: string[]
143
+ }
144
+
145
+ /**
146
+ * The grid of icon tiles a wizard step is usually made of.
147
+ *
148
+ * Single-select renders radios and multi-select renders checkboxes — stated in
149
+ * ARIA rather than implied by how many are lit, because "pick one" and "pick
150
+ * any" are different promises and only one of them is visible in a grid.
151
+ */
152
+ export function ChoiceGrid({
153
+ className,
154
+ max,
155
+ multiple = false,
156
+ onChange,
157
+ options,
158
+ selected,
159
+ }: ChoiceGridProps) {
160
+ const full = multiple && max !== undefined && selected.length >= max
161
+
162
+ const toggle = (id: string) => {
163
+ if (!multiple) {
164
+ onChange([id])
165
+ return
166
+ }
167
+ onChange(selected.includes(id) ? selected.filter((item) => item !== id) : [...selected, id])
168
+ }
169
+
170
+ return (
171
+ <div className={cn('nim-choice-grid', className)} role={multiple ? 'group' : 'radiogroup'}>
172
+ {options.map((option) => {
173
+ const on = selected.includes(option.id)
174
+ return (
175
+ <button
176
+ aria-checked={on}
177
+ className="nim-choice-grid__tile"
178
+ data-on={on ? 'true' : undefined}
179
+ disabled={option.disabled || (full && !on)}
180
+ key={option.id}
181
+ onClick={() => toggle(option.id)}
182
+ role={multiple ? 'checkbox' : 'radio'}
183
+ type="button"
184
+ >
185
+ {option.icon ? <span className="nim-choice-grid__icon">{option.icon}</span> : null}
186
+ <span className="nim-choice-grid__label">{option.label}</span>
187
+ </button>
188
+ )
189
+ })}
190
+ </div>
191
+ )
192
+ }
package/src/index.ts ADDED
@@ -0,0 +1,216 @@
1
+ /**
2
+ * nim — public surface.
3
+ *
4
+ * Importing the kit brings its stylesheet with it, so a consumer can never end
5
+ * up with nim markup and no nim styles. Apps that need to control CSS order
6
+ * themselves can import `nim/styles.css` explicitly instead.
7
+ *
8
+ * Wrap the tree in <NimProvider> to pick a style, colourway, scheme, and
9
+ * direction.
10
+ */
11
+
12
+ import '@/theme/index.css'
13
+
14
+ export { ActivityFeed, AdminShell, DetailHeader, FilterChips } from '@/components/admin-shell'
15
+ export type {
16
+ ActivityEvent,
17
+ ActivityFeedProps,
18
+ AdminNavGroup,
19
+ AdminNavItem,
20
+ AdminShellProps,
21
+ DetailHeaderProps,
22
+ FilterChip,
23
+ FilterChipsProps,
24
+ } from '@/components/admin-shell'
25
+
26
+ export { AppShell } from '@/components/app-shell'
27
+ export type { AppShellProps } from '@/components/app-shell'
28
+
29
+ export { AuthScreen } from '@/components/auth-screen'
30
+ export type { AuthScreenProps } from '@/components/auth-screen'
31
+
32
+ export { Avatar } from '@/components/avatar'
33
+ export type { AvatarProps, AvatarSize } from '@/components/avatar'
34
+
35
+ export { AvatarRing, ProfileHeader } from '@/components/profile-header'
36
+ export type { AvatarRingProps, ProfileHeaderProps } from '@/components/profile-header'
37
+
38
+ export { Badge } from '@/components/badge'
39
+ export type { BadgeProps, BadgeSize, BadgeTone, BadgeVariant } from '@/components/badge'
40
+
41
+ export { Banner } from '@/components/banner'
42
+ export type { BannerProps, BannerTone } from '@/components/banner'
43
+
44
+ export { Breadcrumb } from '@/components/breadcrumb'
45
+ export type { BreadcrumbProps, Crumb } from '@/components/breadcrumb'
46
+
47
+ export { Button } from '@/components/button'
48
+ export type { ButtonProps, ButtonSize, ButtonVariant } from '@/components/button'
49
+
50
+ export { Card } from '@/components/card'
51
+ export type { CardPadding, CardProps, CardVariant } from '@/components/card'
52
+
53
+ export { ActionBar, OptionCard, OrderSummary } from '@/components/checkout'
54
+ export type {
55
+ ActionBarProps,
56
+ OptionCardProps,
57
+ OrderSummaryProps,
58
+ SummaryLine,
59
+ } from '@/components/checkout'
60
+
61
+ export { Chat } from '@/components/chat'
62
+ export type { ChatAttachment, ChatMediaKind, ChatMessage, ChatProps } from '@/components/chat'
63
+
64
+ export { ChatComposer } from '@/components/chat-composer'
65
+ export type { ChatComposerProps, ChatDraft } from '@/components/chat-composer'
66
+
67
+ export { Checkbox, Switch } from '@/components/choice'
68
+ export type { CheckboxProps, SwitchProps } from '@/components/choice'
69
+
70
+ export { Combobox } from '@/components/combobox'
71
+ export type { ComboboxOption, ComboboxProps } from '@/components/combobox'
72
+
73
+ export { Calendar, DateField, DatePicker } from '@/components/date-field'
74
+ export type {
75
+ CalendarProps,
76
+ CalendarSystem,
77
+ DateFieldProps,
78
+ DatePickerProps,
79
+ IsoDate,
80
+ } from '@/components/date-field'
81
+
82
+ export {
83
+ addDays,
84
+ addMonths,
85
+ formatNumeric,
86
+ monthLength,
87
+ parseNumeric,
88
+ partsOf,
89
+ fromParts,
90
+ startOfMonth,
91
+ todayIso,
92
+ } from '@/lib/calendars'
93
+ export type { CalendarParts } from '@/lib/calendars'
94
+
95
+ export { Dialog } from '@/components/dialog'
96
+ export type { DialogProps } from '@/components/dialog'
97
+
98
+ export { EmptyState } from '@/components/empty-state'
99
+ export type { EmptyStateProps } from '@/components/empty-state'
100
+
101
+ export { Progress, Skeleton, Spinner } from '@/components/feedback'
102
+ export type { ProgressProps, SkeletonProps, SpinnerProps } from '@/components/feedback'
103
+
104
+ export { ResourceMeter } from '@/components/resource-meter'
105
+ export type { ResourceMeterProps, ResourceMeterTone } from '@/components/resource-meter'
106
+
107
+ export { Input, Select, Textarea } from '@/components/field'
108
+ export type { InputProps, SelectOption, SelectProps, TextareaProps } from '@/components/field'
109
+
110
+ export { Icon, iconNames } from '@/components/icon'
111
+ export type { IconName, IconProps, IconSize, IconTone } from '@/components/icon'
112
+
113
+ export { IconButton } from '@/components/icon-button'
114
+ export type { IconButtonProps, IconButtonSize, IconButtonVariant } from '@/components/icon-button'
115
+
116
+ export { AppFrame, Inline, Stack } from '@/components/layout'
117
+
118
+ export { List, ListRow } from '@/components/list'
119
+ export type { ListProps, ListRowProps } from '@/components/list'
120
+
121
+ export { Menu, Popover } from '@/components/menu'
122
+ export type { MenuAction, MenuHeading, MenuItem, MenuProps, MenuSeparator, PopoverProps } from '@/components/menu'
123
+
124
+ export { Onboarding } from '@/components/onboarding'
125
+ export type { OnboardingProps, OnboardingSlide } from '@/components/onboarding'
126
+
127
+ export { OtpInput } from '@/components/otp-input'
128
+ export type { OtpInputProps } from '@/components/otp-input'
129
+
130
+ export { Pagination } from '@/components/pagination'
131
+ export type { PaginationProps } from '@/components/pagination'
132
+
133
+ export { PasswordField, scorePassword } from '@/components/password-field'
134
+ export type { PasswordFieldProps, PasswordStrength } from '@/components/password-field'
135
+
136
+ export { PhoneField, toE164 } from '@/components/phone-field'
137
+ export type { PhoneFieldProps } from '@/components/phone-field'
138
+
139
+ export { PlanCard } from '@/components/plan-card'
140
+ export type { PlanCardProps, PlanFeature } from '@/components/plan-card'
141
+
142
+ export { PlanPicker } from '@/components/plan-picker'
143
+ export type { BillingCycle, PlanOffer, PlanPickerProps } from '@/components/plan-picker'
144
+
145
+ export { ProfileScreen } from '@/components/profile-screen'
146
+ export type { ProfileRow, ProfileScreenProps, ProfileSection } from '@/components/profile-screen'
147
+
148
+ export { SectionHeader } from '@/components/section-header'
149
+ export type { SectionHeaderProps } from '@/components/section-header'
150
+
151
+ export { Segmented } from '@/components/segmented'
152
+ export type { SegmentedOption, SegmentedProps } from '@/components/segmented'
153
+
154
+ export { SignInFlow } from '@/components/sign-in-flow'
155
+ export type { SignInCopy, SignInFlowProps, SignInMethod } from '@/components/sign-in-flow'
156
+
157
+ export { Sheet } from '@/components/sheet'
158
+ export type { SheetProps } from '@/components/sheet'
159
+
160
+ export { Slider } from '@/components/slider'
161
+ export type { SliderProps } from '@/components/slider'
162
+
163
+ export { Stat } from '@/components/stat'
164
+ export type { StatProps } from '@/components/stat'
165
+
166
+ export { Stepper } from '@/components/stepper'
167
+ export type { StepperProps } from '@/components/stepper'
168
+
169
+ export { TaskProgress } from '@/components/task-progress'
170
+ export type { TaskProgressProps, TaskStep, TaskStepStatus } from '@/components/task-progress'
171
+
172
+ export { Table } from '@/components/table'
173
+ export type { SortDirection, TableColumn, TableProps } from '@/components/table'
174
+
175
+ export { TabBar } from '@/components/tab-bar'
176
+ export type { TabBarItem, TabBarProps } from '@/components/tab-bar'
177
+
178
+ export { Tabs } from '@/components/tabs'
179
+ export type { TabOption, TabsProps } from '@/components/tabs'
180
+
181
+ export { NimProvider, useNim, useSchemeToggle } from '@/components/theme'
182
+ export type {
183
+ NimColorway,
184
+ NimDirection,
185
+ NimProviderProps,
186
+ NimScheme,
187
+ NimStyle,
188
+ } from '@/components/theme'
189
+
190
+ export { ToastProvider, useToast } from '@/components/toast'
191
+ export type { ToastOptions, ToastTone } from '@/components/toast'
192
+
193
+ export { Tooltip } from '@/components/tooltip'
194
+ export type { TooltipProps } from '@/components/tooltip'
195
+
196
+ export { ChoiceGrid, Wizard } from '@/components/wizard'
197
+ export type {
198
+ ChoiceGridOption,
199
+ ChoiceGridProps,
200
+ WizardProps,
201
+ WizardStep,
202
+ } from '@/components/wizard'
203
+
204
+ export { Body, Caption, Display, Label, Rule, Title } from '@/components/typography'
205
+
206
+ export {
207
+ COUNTRIES,
208
+ countryByDial,
209
+ countryByIso2,
210
+ countryNamer,
211
+ toAsciiDigits,
212
+ } from '@/lib/countries'
213
+ export type { Country } from '@/lib/countries'
214
+
215
+ export { cn } from '@/lib/cn'
216
+ export type { ClassValue } from '@/lib/cn'