@aspect-ops/exon-ui 0.2.0 → 0.2.1

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 (38) hide show
  1. package/README.md +200 -0
  2. package/dist/components/Accordion/Accordion.svelte +2 -2
  3. package/dist/components/Accordion/AccordionItem.svelte +2 -2
  4. package/dist/components/Chatbot/ChatMessage.svelte +143 -0
  5. package/dist/components/Chatbot/ChatMessage.svelte.d.ts +8 -0
  6. package/dist/components/Chatbot/Chatbot.svelte +640 -0
  7. package/dist/components/Chatbot/Chatbot.svelte.d.ts +22 -0
  8. package/dist/components/Chatbot/index.d.ts +3 -0
  9. package/dist/components/Chatbot/index.js +2 -0
  10. package/dist/components/Chatbot/types.d.ts +48 -0
  11. package/dist/components/Chatbot/types.js +2 -0
  12. package/dist/components/ContactForm/ContactForm.svelte +564 -0
  13. package/dist/components/ContactForm/ContactForm.svelte.d.ts +44 -0
  14. package/dist/components/ContactForm/index.d.ts +1 -0
  15. package/dist/components/ContactForm/index.js +1 -0
  16. package/dist/components/DoughnutChart/DoughnutChart.svelte +372 -0
  17. package/dist/components/DoughnutChart/DoughnutChart.svelte.d.ts +25 -0
  18. package/dist/components/DoughnutChart/index.d.ts +1 -0
  19. package/dist/components/DoughnutChart/index.js +1 -0
  20. package/dist/components/FAB/FAB.svelte +5 -1
  21. package/dist/components/FAB/FABGroup.svelte +10 -2
  22. package/dist/components/FileUpload/FileUpload.svelte +12 -12
  23. package/dist/components/Mermaid/Mermaid.svelte +206 -0
  24. package/dist/components/Mermaid/Mermaid.svelte.d.ts +28 -0
  25. package/dist/components/Mermaid/index.d.ts +1 -0
  26. package/dist/components/Mermaid/index.js +1 -0
  27. package/dist/components/Mermaid/mermaid.d.ts +21 -0
  28. package/dist/components/Popover/PopoverTrigger.svelte +1 -3
  29. package/dist/components/ViewCounter/ViewCounter.svelte +157 -0
  30. package/dist/components/ViewCounter/ViewCounter.svelte.d.ts +17 -0
  31. package/dist/components/ViewCounter/index.d.ts +1 -0
  32. package/dist/components/ViewCounter/index.js +1 -0
  33. package/dist/index.d.ts +10 -1
  34. package/dist/index.js +9 -0
  35. package/dist/styles/tokens.css +2 -1
  36. package/dist/types/index.d.ts +1 -1
  37. package/dist/types/input.d.ts +20 -0
  38. package/package.json +2 -1
@@ -0,0 +1,206 @@
1
+ <script lang="ts">
2
+ import { onMount } from 'svelte';
3
+ import type { Snippet } from 'svelte';
4
+
5
+ interface ThemeVariables {
6
+ primaryColor?: string;
7
+ primaryTextColor?: string;
8
+ primaryBorderColor?: string;
9
+ lineColor?: string;
10
+ secondaryColor?: string;
11
+ tertiaryColor?: string;
12
+ background?: string;
13
+ mainBkg?: string;
14
+ nodeBorder?: string;
15
+ clusterBkg?: string;
16
+ titleColor?: string;
17
+ edgeLabelBackground?: string;
18
+ }
19
+
20
+ interface Props {
21
+ /** Mermaid diagram code. If not provided, uses slot content */
22
+ code?: string;
23
+ /** Custom theme variables */
24
+ theme?: ThemeVariables;
25
+ /** Custom class */
26
+ class?: string;
27
+ /** Slot content for diagram code */
28
+ children?: Snippet;
29
+ }
30
+
31
+ // Default ExonPro theme
32
+ const defaultTheme: ThemeVariables = {
33
+ primaryColor: '#4654A3',
34
+ primaryTextColor: '#270949',
35
+ primaryBorderColor: '#4654A3',
36
+ lineColor: '#270949',
37
+ secondaryColor: '#FF3131',
38
+ tertiaryColor: '#f3f4f6'
39
+ };
40
+
41
+ let { code, theme = defaultTheme, class: className = '', children }: Props = $props();
42
+
43
+ let containerRef: HTMLDivElement | undefined = $state();
44
+ let slotRef: HTMLDivElement | undefined = $state();
45
+ let isLoading = $state(true);
46
+ let hasError = $state(false);
47
+ let errorMessage = $state('');
48
+ let renderedSvg = $state('');
49
+
50
+ // Get diagram code from prop or slot
51
+ function getDiagramCode(): string {
52
+ if (code) return code;
53
+ if (slotRef) {
54
+ return slotRef.textContent?.trim() || '';
55
+ }
56
+ return '';
57
+ }
58
+
59
+ onMount(async () => {
60
+ try {
61
+ // Dynamically import mermaid (type assertion for dynamic import)
62
+ const mermaidModule = await import('mermaid');
63
+ const mermaid = mermaidModule.default;
64
+
65
+ // Initialize mermaid with theme
66
+ mermaid.initialize({
67
+ startOnLoad: false,
68
+ theme: 'base',
69
+ themeVariables: { ...defaultTheme, ...theme },
70
+ securityLevel: 'loose',
71
+ fontFamily: 'inherit'
72
+ });
73
+
74
+ const diagramCode = getDiagramCode();
75
+ if (!diagramCode) {
76
+ hasError = true;
77
+ errorMessage = 'No diagram code provided';
78
+ isLoading = false;
79
+ return;
80
+ }
81
+
82
+ // Generate unique ID
83
+ const id = `mermaid-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
84
+
85
+ // Render the diagram
86
+ const { svg } = await mermaid.render(id, diagramCode);
87
+ renderedSvg = svg;
88
+ } catch (error) {
89
+ hasError = true;
90
+ errorMessage = error instanceof Error ? error.message : 'Failed to render diagram';
91
+ } finally {
92
+ isLoading = false;
93
+ }
94
+ });
95
+ </script>
96
+
97
+ <div class="mermaid-container {className}" bind:this={containerRef}>
98
+ <!-- Hidden slot for extracting diagram code -->
99
+ <div bind:this={slotRef} style="display: none;">
100
+ {#if children}
101
+ {@render children()}
102
+ {/if}
103
+ </div>
104
+
105
+ {#if isLoading}
106
+ <div class="mermaid-loading">
107
+ <div class="mermaid-spinner"></div>
108
+ <span>Rendering diagram...</span>
109
+ </div>
110
+ {:else if hasError}
111
+ <div class="mermaid-error" role="alert">
112
+ <svg
113
+ xmlns="http://www.w3.org/2000/svg"
114
+ width="24"
115
+ height="24"
116
+ viewBox="0 0 24 24"
117
+ fill="none"
118
+ stroke="currentColor"
119
+ stroke-width="2"
120
+ >
121
+ <circle cx="12" cy="12" r="10" />
122
+ <line x1="12" y1="8" x2="12" y2="12" />
123
+ <line x1="12" y1="16" x2="12.01" y2="16" />
124
+ </svg>
125
+ <div>
126
+ <strong>Failed to render diagram</strong>
127
+ <p>{errorMessage}</p>
128
+ </div>
129
+ </div>
130
+ {:else}
131
+ <!-- eslint-disable-next-line svelte/no-at-html-tags -->
132
+ <div class="mermaid-diagram">{@html renderedSvg}</div>
133
+ {/if}
134
+ </div>
135
+
136
+ <style>
137
+ .mermaid-container {
138
+ width: 100%;
139
+ font-family: inherit;
140
+ }
141
+
142
+ /* Loading */
143
+ .mermaid-loading {
144
+ display: flex;
145
+ flex-direction: column;
146
+ align-items: center;
147
+ justify-content: center;
148
+ gap: var(--space-md, 1rem);
149
+ padding: var(--space-xl, 2rem);
150
+ color: var(--color-text-muted, #6b7280);
151
+ font-size: var(--text-sm, 0.875rem);
152
+ }
153
+
154
+ .mermaid-spinner {
155
+ width: 2rem;
156
+ height: 2rem;
157
+ border: 3px solid var(--color-border, #e5e7eb);
158
+ border-top-color: var(--color-primary, #3b82f6);
159
+ border-radius: var(--radius-full, 9999px);
160
+ animation: spin 0.75s linear infinite;
161
+ }
162
+
163
+ @keyframes spin {
164
+ to {
165
+ transform: rotate(360deg);
166
+ }
167
+ }
168
+
169
+ /* Error */
170
+ .mermaid-error {
171
+ display: flex;
172
+ align-items: flex-start;
173
+ gap: var(--space-md, 1rem);
174
+ padding: var(--space-md, 1rem);
175
+ background: var(--color-error-bg, #fee2e2);
176
+ color: var(--color-error, #dc2626);
177
+ border-radius: var(--radius-md, 0.375rem);
178
+ font-size: var(--text-sm, 0.875rem);
179
+ }
180
+
181
+ .mermaid-error svg {
182
+ flex-shrink: 0;
183
+ margin-top: 2px;
184
+ }
185
+
186
+ .mermaid-error strong {
187
+ display: block;
188
+ font-weight: var(--font-semibold, 600);
189
+ }
190
+
191
+ .mermaid-error p {
192
+ margin: var(--space-xs, 0.25rem) 0 0;
193
+ opacity: 0.9;
194
+ }
195
+
196
+ /* Diagram */
197
+ .mermaid-diagram {
198
+ width: 100%;
199
+ overflow-x: auto;
200
+ }
201
+
202
+ .mermaid-diagram :global(svg) {
203
+ max-width: 100%;
204
+ height: auto;
205
+ }
206
+ </style>
@@ -0,0 +1,28 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface ThemeVariables {
3
+ primaryColor?: string;
4
+ primaryTextColor?: string;
5
+ primaryBorderColor?: string;
6
+ lineColor?: string;
7
+ secondaryColor?: string;
8
+ tertiaryColor?: string;
9
+ background?: string;
10
+ mainBkg?: string;
11
+ nodeBorder?: string;
12
+ clusterBkg?: string;
13
+ titleColor?: string;
14
+ edgeLabelBackground?: string;
15
+ }
16
+ interface Props {
17
+ /** Mermaid diagram code. If not provided, uses slot content */
18
+ code?: string;
19
+ /** Custom theme variables */
20
+ theme?: ThemeVariables;
21
+ /** Custom class */
22
+ class?: string;
23
+ /** Slot content for diagram code */
24
+ children?: Snippet;
25
+ }
26
+ declare const Mermaid: import("svelte").Component<Props, {}, "">;
27
+ type Mermaid = ReturnType<typeof Mermaid>;
28
+ export default Mermaid;
@@ -0,0 +1 @@
1
+ export { default as Mermaid } from './Mermaid.svelte';
@@ -0,0 +1 @@
1
+ export { default as Mermaid } from './Mermaid.svelte';
@@ -0,0 +1,21 @@
1
+ // Type declarations for mermaid
2
+ declare module 'mermaid' {
3
+ interface MermaidConfig {
4
+ startOnLoad?: boolean;
5
+ theme?: string;
6
+ themeVariables?: Record<string, string | undefined>;
7
+ securityLevel?: string;
8
+ fontFamily?: string;
9
+ }
10
+
11
+ interface RenderResult {
12
+ svg: string;
13
+ }
14
+
15
+ const mermaid: {
16
+ initialize: (config: MermaidConfig) => void;
17
+ render: (id: string, code: string) => Promise<RenderResult>;
18
+ };
19
+
20
+ export default mermaid;
21
+ }
@@ -9,6 +9,4 @@
9
9
  let { class: className = '', children }: Props = $props();
10
10
  </script>
11
11
 
12
- <BitsPopover.Trigger class={className}>
13
- {@render children?.()}
14
- </BitsPopover.Trigger>
12
+ <BitsPopover.Trigger child={children}></BitsPopover.Trigger>
@@ -0,0 +1,157 @@
1
+ <script lang="ts">
2
+ import { onMount } from 'svelte';
3
+
4
+ interface Props {
5
+ /** Unique identifier for the content being viewed */
6
+ slug: string;
7
+ /** Whether to show the "views" label */
8
+ showLabel?: boolean;
9
+ /** Whether to track the view (POST to API) or just display */
10
+ trackView?: boolean;
11
+ /** Custom class */
12
+ class?: string;
13
+ /** Callback to get current view count */
14
+ onGetCount?: (slug: string) => Promise<number>;
15
+ /** Callback to track/increment view */
16
+ onTrackView?: (slug: string) => Promise<number>;
17
+ }
18
+
19
+ let {
20
+ slug,
21
+ showLabel = true,
22
+ trackView = true,
23
+ class: className = '',
24
+ onGetCount,
25
+ onTrackView
26
+ }: Props = $props();
27
+
28
+ let viewCount = $state<number | null>(null);
29
+ let isLoading = $state(true);
30
+ let hasError = $state(false);
31
+
32
+ // Format large numbers (1K, 1M, etc.)
33
+ function formatCount(count: number): string {
34
+ if (count >= 1000000) {
35
+ return (count / 1000000).toFixed(1).replace(/\.0$/, '') + 'M';
36
+ }
37
+ if (count >= 1000) {
38
+ return (count / 1000).toFixed(1).replace(/\.0$/, '') + 'K';
39
+ }
40
+ return count.toString();
41
+ }
42
+
43
+ // Check if already viewed in this session
44
+ function hasViewedInSession(): boolean {
45
+ if (typeof window === 'undefined') return false;
46
+ const viewed = sessionStorage.getItem(`viewed_${slug}`);
47
+ return viewed === 'true';
48
+ }
49
+
50
+ // Mark as viewed in session
51
+ function markViewedInSession(): void {
52
+ if (typeof window !== 'undefined') {
53
+ sessionStorage.setItem(`viewed_${slug}`, 'true');
54
+ }
55
+ }
56
+
57
+ onMount(async () => {
58
+ try {
59
+ // If tracking is enabled and not already viewed
60
+ if (trackView && onTrackView && !hasViewedInSession()) {
61
+ viewCount = await onTrackView(slug);
62
+ markViewedInSession();
63
+ } else if (onGetCount) {
64
+ // Just get the count without tracking
65
+ viewCount = await onGetCount(slug);
66
+ } else {
67
+ // No callbacks provided, show 0
68
+ viewCount = 0;
69
+ }
70
+ } catch {
71
+ hasError = true;
72
+ viewCount = 0;
73
+ } finally {
74
+ isLoading = false;
75
+ }
76
+ });
77
+
78
+ const formattedCount = $derived(viewCount !== null ? formatCount(viewCount) : '—');
79
+ </script>
80
+
81
+ <span class="view-counter {className}" class:view-counter--loading={isLoading}>
82
+ <svg
83
+ xmlns="http://www.w3.org/2000/svg"
84
+ width="16"
85
+ height="16"
86
+ viewBox="0 0 24 24"
87
+ fill="none"
88
+ stroke="currentColor"
89
+ stroke-width="2"
90
+ stroke-linecap="round"
91
+ stroke-linejoin="round"
92
+ class="view-counter__icon"
93
+ aria-hidden="true"
94
+ >
95
+ <path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z" />
96
+ <circle cx="12" cy="12" r="3" />
97
+ </svg>
98
+ <span class="view-counter__count">
99
+ {#if isLoading}
100
+ <span class="view-counter__skeleton"></span>
101
+ {:else}
102
+ {formattedCount}
103
+ {/if}
104
+ </span>
105
+ {#if showLabel}
106
+ <span class="view-counter__label">views</span>
107
+ {/if}
108
+ </span>
109
+
110
+ <style>
111
+ .view-counter {
112
+ display: inline-flex;
113
+ align-items: center;
114
+ gap: var(--space-xs, 0.25rem);
115
+ font-size: var(--text-sm, 0.875rem);
116
+ color: var(--color-text-muted, #6b7280);
117
+ font-family: inherit;
118
+ }
119
+
120
+ .view-counter__icon {
121
+ flex-shrink: 0;
122
+ opacity: 0.7;
123
+ }
124
+
125
+ .view-counter__count {
126
+ font-weight: var(--font-medium, 500);
127
+ min-width: 1.5rem;
128
+ }
129
+
130
+ .view-counter__label {
131
+ opacity: 0.8;
132
+ }
133
+
134
+ .view-counter__skeleton {
135
+ display: inline-block;
136
+ width: 2rem;
137
+ height: 1em;
138
+ background: linear-gradient(
139
+ 90deg,
140
+ var(--color-bg-muted, #f3f4f6) 25%,
141
+ var(--color-border, #e5e7eb) 50%,
142
+ var(--color-bg-muted, #f3f4f6) 75%
143
+ );
144
+ background-size: 200% 100%;
145
+ animation: skeleton-pulse 1.5s ease-in-out infinite;
146
+ border-radius: var(--radius-sm, 0.25rem);
147
+ }
148
+
149
+ @keyframes skeleton-pulse {
150
+ 0% {
151
+ background-position: 200% 0;
152
+ }
153
+ 100% {
154
+ background-position: -200% 0;
155
+ }
156
+ }
157
+ </style>
@@ -0,0 +1,17 @@
1
+ interface Props {
2
+ /** Unique identifier for the content being viewed */
3
+ slug: string;
4
+ /** Whether to show the "views" label */
5
+ showLabel?: boolean;
6
+ /** Whether to track the view (POST to API) or just display */
7
+ trackView?: boolean;
8
+ /** Custom class */
9
+ class?: string;
10
+ /** Callback to get current view count */
11
+ onGetCount?: (slug: string) => Promise<number>;
12
+ /** Callback to track/increment view */
13
+ onTrackView?: (slug: string) => Promise<number>;
14
+ }
15
+ declare const ViewCounter: import("svelte").Component<Props, {}, "">;
16
+ type ViewCounter = ReturnType<typeof ViewCounter>;
17
+ export default ViewCounter;
@@ -0,0 +1 @@
1
+ export { default as ViewCounter } from './ViewCounter.svelte';
@@ -0,0 +1 @@
1
+ export { default as ViewCounter } from './ViewCounter.svelte';
package/dist/index.d.ts CHANGED
@@ -19,6 +19,9 @@ export { OTPInput } from './components/OTPInput/index.js';
19
19
  export { TimePicker } from './components/TimePicker/index.js';
20
20
  export { Rating } from './components/Rating/index.js';
21
21
  export { ToggleGroup, ToggleGroupItem } from './components/ToggleGroup/index.js';
22
+ export { NumberInput } from './components/NumberInput/index.js';
23
+ export { Pagination } from './components/Pagination/index.js';
24
+ export { Chip, ChipGroup } from './components/Chip/index.js';
22
25
  export { default as Tabs } from './components/Tabs/Tabs.svelte';
23
26
  export { default as TabList } from './components/Tabs/TabList.svelte';
24
27
  export { default as TabTrigger } from './components/Tabs/TabTrigger.svelte';
@@ -74,4 +77,10 @@ export { ActionSheet, ActionSheetItem } from './components/ActionSheet/index.js'
74
77
  export { PullToRefresh } from './components/PullToRefresh/index.js';
75
78
  export { SwipeActions, SwipeAction } from './components/SwipeActions/index.js';
76
79
  export { FAB, FABGroup } from './components/FAB/index.js';
77
- export type { ButtonProps, ButtonVariant, ButtonSize, TypographyProps, TypographyVariant, IconProps, IconSize, BadgeProps, BadgeVariant, LinkProps, InputSize, TextInputType, FormFieldProps, TextInputProps, TextareaProps, SelectOption, SelectProps, CheckboxProps, RadioProps, RadioGroupProps, SwitchProps, SearchInputProps, DatePickerProps, FileUploadProps, OTPInputProps, TimeFormat, TimePickerProps, RatingProps, ToggleGroupType, ToggleGroupOrientation, ToggleGroupProps, ToggleGroupItemProps, TabsOrientation, TabsProps, TabListProps, TabTriggerProps, TabContentProps, MenuProps, MenuTriggerProps, MenuContentProps, MenuItemProps, MenuSeparatorProps, MenuSubProps, MenuSubTriggerProps, MenuSubContentProps, BreadcrumbItemData, BreadcrumbsProps, BreadcrumbItemProps, BottomNavItemData, BottomNavProps, BottomNavItemProps, NavItemProps, NavbarProps, SidebarItemData, SidebarProps, SidebarItemProps, SidebarGroupProps, StepperOrientation, StepperProps, StepperStepProps, AlertVariant, AlertProps, ToastVariant, ToastPosition, ToastData, ToastProps, ToastContainerProps, ModalSize, ModalProps, ModalHeaderProps, ModalBodyProps, ModalFooterProps, ProgressSize, ProgressBarProps, ProgressCircleProps, SpinnerProps, TooltipSide, TooltipProps, PopoverSide, PopoverProps, PopoverTriggerProps, PopoverContentProps, SkeletonVariant, SkeletonProps, CardVariant, CardProps, CardHeaderProps, CardBodyProps, CardFooterProps, AvatarSize, AvatarShape, AvatarProps, AvatarGroupProps, TagVariant, TagSize, TagProps, ChipVariant, ChipColor, ChipSize, ChipProps, ChipGroupProps, EmptyStateSize, EmptyStateProps, ListProps, ListItemProps, TableProps, TableHeadProps, TableHeaderAlign, TableHeaderSortDirection, TableHeaderProps, TableBodyProps, TableRowProps, TableCellAlign, TableCellProps, AccordionProps, AccordionItemProps, SliderProps, CarouselProps, CarouselSlideProps, ImageObjectFit, ImageRounded, ImageProps, ContainerSize, ContainerProps, GridAlign, GridJustify, SpacingToken, GridProps, GridItemProps, StackDirection, StackProps, DividerOrientation, DividerProps, SpacerSize, SpacerProps, AspectRatioPreset, AspectRatioProps, CenterProps, BoxProps, SafeAreaEdge, SafeAreaProps, BottomSheetSnapPoint, BottomSheetProps, BottomSheetHeaderProps, BottomSheetBodyProps, ActionSheetAction, ActionSheetProps, ActionSheetItemProps, PullToRefreshProps, SwipeActionSide, SwipeActionData, SwipeActionsProps, SwipeActionProps, FABSize, FABPosition, FABProps, FABAction, FABGroupProps } from './types/index.js';
80
+ export { Chatbot, ChatMessage } from './components/Chatbot/index.js';
81
+ export type { ChatMessage as ChatMessageType, MessageRole, LeadData, ChatbotProps } from './components/Chatbot/types.js';
82
+ export { ContactForm } from './components/ContactForm/index.js';
83
+ export { ViewCounter } from './components/ViewCounter/index.js';
84
+ export { Mermaid } from './components/Mermaid/index.js';
85
+ export { DoughnutChart } from './components/DoughnutChart/index.js';
86
+ export type { ButtonProps, ButtonVariant, ButtonSize, TypographyProps, TypographyVariant, IconProps, IconSize, BadgeProps, BadgeVariant, LinkProps, InputSize, TextInputType, FormFieldProps, TextInputProps, TextareaProps, SelectOption, SelectProps, CheckboxProps, RadioProps, RadioGroupProps, SwitchProps, SearchInputProps, DatePickerProps, FileUploadProps, OTPInputProps, TimeFormat, TimePickerProps, RatingProps, ToggleGroupType, ToggleGroupOrientation, ToggleGroupProps, ToggleGroupItemProps, NumberInputProps, PaginationProps, TabsOrientation, TabsProps, TabListProps, TabTriggerProps, TabContentProps, MenuProps, MenuTriggerProps, MenuContentProps, MenuItemProps, MenuSeparatorProps, MenuSubProps, MenuSubTriggerProps, MenuSubContentProps, BreadcrumbItemData, BreadcrumbsProps, BreadcrumbItemProps, BottomNavItemData, BottomNavProps, BottomNavItemProps, NavItemProps, NavbarProps, SidebarItemData, SidebarProps, SidebarItemProps, SidebarGroupProps, StepperOrientation, StepperProps, StepperStepProps, AlertVariant, AlertProps, ToastVariant, ToastPosition, ToastData, ToastProps, ToastContainerProps, ModalSize, ModalProps, ModalHeaderProps, ModalBodyProps, ModalFooterProps, ProgressSize, ProgressBarProps, ProgressCircleProps, SpinnerProps, TooltipSide, TooltipProps, PopoverSide, PopoverProps, PopoverTriggerProps, PopoverContentProps, SkeletonVariant, SkeletonProps, CardVariant, CardProps, CardHeaderProps, CardBodyProps, CardFooterProps, AvatarSize, AvatarShape, AvatarProps, AvatarGroupProps, TagVariant, TagSize, TagProps, ChipVariant, ChipColor, ChipSize, ChipProps, ChipGroupProps, EmptyStateSize, EmptyStateProps, ListProps, ListItemProps, TableProps, TableHeadProps, TableHeaderAlign, TableHeaderSortDirection, TableHeaderProps, TableBodyProps, TableRowProps, TableCellAlign, TableCellProps, AccordionProps, AccordionItemProps, SliderProps, CarouselProps, CarouselSlideProps, ImageObjectFit, ImageRounded, ImageProps, ContainerSize, ContainerProps, GridAlign, GridJustify, SpacingToken, GridProps, GridItemProps, StackDirection, StackProps, DividerOrientation, DividerProps, SpacerSize, SpacerProps, AspectRatioPreset, AspectRatioProps, CenterProps, BoxProps, SafeAreaEdge, SafeAreaProps, BottomSheetSnapPoint, BottomSheetProps, BottomSheetHeaderProps, BottomSheetBodyProps, ActionSheetAction, ActionSheetProps, ActionSheetItemProps, PullToRefreshProps, SwipeActionSide, SwipeActionData, SwipeActionsProps, SwipeActionProps, FABSize, FABPosition, FABProps, FABAction, FABGroupProps } from './types/index.js';
package/dist/index.js CHANGED
@@ -23,6 +23,9 @@ export { OTPInput } from './components/OTPInput/index.js';
23
23
  export { TimePicker } from './components/TimePicker/index.js';
24
24
  export { Rating } from './components/Rating/index.js';
25
25
  export { ToggleGroup, ToggleGroupItem } from './components/ToggleGroup/index.js';
26
+ export { NumberInput } from './components/NumberInput/index.js';
27
+ export { Pagination } from './components/Pagination/index.js';
28
+ export { Chip, ChipGroup } from './components/Chip/index.js';
26
29
  // Navigation Components
27
30
  export { default as Tabs } from './components/Tabs/Tabs.svelte';
28
31
  export { default as TabList } from './components/Tabs/TabList.svelte';
@@ -83,3 +86,9 @@ export { ActionSheet, ActionSheetItem } from './components/ActionSheet/index.js'
83
86
  export { PullToRefresh } from './components/PullToRefresh/index.js';
84
87
  export { SwipeActions, SwipeAction } from './components/SwipeActions/index.js';
85
88
  export { FAB, FABGroup } from './components/FAB/index.js';
89
+ // Website Components
90
+ export { Chatbot, ChatMessage } from './components/Chatbot/index.js';
91
+ export { ContactForm } from './components/ContactForm/index.js';
92
+ export { ViewCounter } from './components/ViewCounter/index.js';
93
+ export { Mermaid } from './components/Mermaid/index.js';
94
+ export { DoughnutChart } from './components/DoughnutChart/index.js';
@@ -153,7 +153,8 @@
153
153
  * Scale: 1.2 → 1.25
154
154
  * ======================================== */
155
155
 
156
- --font-family: system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
156
+ --font-family:
157
+ 'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
157
158
  --font-family-mono: ui-monospace, 'SF Mono', Menlo, Monaco, 'Cascadia Code', monospace;
158
159
 
159
160
  /* Fluid type scale */
@@ -131,4 +131,4 @@ export type { AlertVariant, AlertProps, ToastVariant, ToastPosition, ToastData,
131
131
  export type { CardVariant, CardProps, CardHeaderProps, CardBodyProps, CardFooterProps, AvatarSize, AvatarShape, AvatarProps, AvatarGroupProps, TagVariant, TagSize, TagProps, ChipVariant, ChipColor, ChipSize, ChipProps, ChipGroupProps, EmptyStateSize, EmptyStateProps, ListProps, ListItemProps, TableProps, TableHeadProps, TableHeaderAlign, TableHeaderSortDirection, TableHeaderProps, TableBodyProps, TableRowProps, TableCellAlign, TableCellProps, AccordionProps, AccordionItemProps, SliderProps, CarouselProps, CarouselSlideProps, ImageObjectFit, ImageRounded, ImageProps } from './data-display.js';
132
132
  export type { ContainerSize, ContainerProps, GridAlign, GridJustify, SpacingToken, GridProps, GridItemProps, StackDirection, StackProps, DividerOrientation, DividerProps, SpacerSize, SpacerProps, AspectRatioPreset, AspectRatioProps, CenterProps, BoxProps } from './layout.js';
133
133
  export type { SafeAreaEdge, SafeAreaProps, BottomSheetSnapPoint, BottomSheetProps, BottomSheetHeaderProps, BottomSheetBodyProps, ActionSheetAction, ActionSheetProps, ActionSheetItemProps, PullToRefreshProps, SwipeActionSide, SwipeActionData, SwipeActionsProps, SwipeActionProps, FABSize, FABPosition, FABProps, FABAction, FABGroupProps } from './mobile.js';
134
- export type { SearchInputProps, DatePickerProps, FileUploadProps, OTPInputProps, TimeFormat, TimePickerProps, RatingProps, ToggleGroupType, ToggleGroupOrientation, ToggleGroupProps, ToggleGroupItemProps } from './input.js';
134
+ export type { SearchInputProps, DatePickerProps, FileUploadProps, OTPInputProps, TimeFormat, TimePickerProps, RatingProps, ToggleGroupType, ToggleGroupOrientation, ToggleGroupProps, ToggleGroupItemProps, NumberInputProps, PaginationProps } from './input.js';
@@ -80,3 +80,23 @@ export interface ToggleGroupItemProps {
80
80
  disabled?: boolean;
81
81
  class?: string;
82
82
  }
83
+ export interface NumberInputProps {
84
+ value?: number | null;
85
+ min?: number;
86
+ max?: number;
87
+ step?: number;
88
+ disabled?: boolean;
89
+ placeholder?: string;
90
+ name?: string;
91
+ id?: string;
92
+ error?: boolean;
93
+ class?: string;
94
+ onValueChange?: (value: number | null) => void;
95
+ }
96
+ export interface PaginationProps {
97
+ currentPage: number;
98
+ totalPages: number;
99
+ siblingCount?: number;
100
+ onPageChange?: (page: number) => void;
101
+ class?: string;
102
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aspect-ops/exon-ui",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Reusable Svelte UI components for web and Capacitor mobile apps",
5
5
  "author": "Exon Team",
6
6
  "license": "MIT",
@@ -98,6 +98,7 @@
98
98
  "husky": "^9.1.7",
99
99
  "jsdom": "^25.0.0",
100
100
  "lint-staged": "^16.2.7",
101
+ "mermaid": "^11.12.2",
101
102
  "prettier": "^3.0.0",
102
103
  "prettier-plugin-svelte": "^3.0.0",
103
104
  "publint": "^0.2.0",