@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.
- package/README.md +200 -0
- package/dist/components/Accordion/Accordion.svelte +2 -2
- package/dist/components/Accordion/AccordionItem.svelte +2 -2
- package/dist/components/Chatbot/ChatMessage.svelte +143 -0
- package/dist/components/Chatbot/ChatMessage.svelte.d.ts +8 -0
- package/dist/components/Chatbot/Chatbot.svelte +640 -0
- package/dist/components/Chatbot/Chatbot.svelte.d.ts +22 -0
- package/dist/components/Chatbot/index.d.ts +3 -0
- package/dist/components/Chatbot/index.js +2 -0
- package/dist/components/Chatbot/types.d.ts +48 -0
- package/dist/components/Chatbot/types.js +2 -0
- package/dist/components/ContactForm/ContactForm.svelte +564 -0
- package/dist/components/ContactForm/ContactForm.svelte.d.ts +44 -0
- package/dist/components/ContactForm/index.d.ts +1 -0
- package/dist/components/ContactForm/index.js +1 -0
- package/dist/components/DoughnutChart/DoughnutChart.svelte +372 -0
- package/dist/components/DoughnutChart/DoughnutChart.svelte.d.ts +25 -0
- package/dist/components/DoughnutChart/index.d.ts +1 -0
- package/dist/components/DoughnutChart/index.js +1 -0
- package/dist/components/FAB/FAB.svelte +5 -1
- package/dist/components/FAB/FABGroup.svelte +10 -2
- package/dist/components/FileUpload/FileUpload.svelte +12 -12
- package/dist/components/Mermaid/Mermaid.svelte +206 -0
- package/dist/components/Mermaid/Mermaid.svelte.d.ts +28 -0
- package/dist/components/Mermaid/index.d.ts +1 -0
- package/dist/components/Mermaid/index.js +1 -0
- package/dist/components/Mermaid/mermaid.d.ts +21 -0
- package/dist/components/Popover/PopoverTrigger.svelte +1 -3
- package/dist/components/ViewCounter/ViewCounter.svelte +157 -0
- package/dist/components/ViewCounter/ViewCounter.svelte.d.ts +17 -0
- package/dist/components/ViewCounter/index.d.ts +1 -0
- package/dist/components/ViewCounter/index.js +1 -0
- package/dist/index.d.ts +10 -1
- package/dist/index.js +9 -0
- package/dist/styles/tokens.css +2 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/input.d.ts +20 -0
- 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
|
+
}
|
|
@@ -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
|
|
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';
|
package/dist/styles/tokens.css
CHANGED
|
@@ -153,7 +153,8 @@
|
|
|
153
153
|
* Scale: 1.2 → 1.25
|
|
154
154
|
* ======================================== */
|
|
155
155
|
|
|
156
|
-
--font-family:
|
|
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 */
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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';
|
package/dist/types/input.d.ts
CHANGED
|
@@ -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.
|
|
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",
|