@aspect-ops/exon-ui 0.2.1 → 0.3.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 (75) hide show
  1. package/dist/components/AspectRatio/AspectRatio.svelte +1 -0
  2. package/dist/components/CTASection/CTASection.svelte +298 -0
  3. package/dist/components/CTASection/CTASection.svelte.d.ts +15 -0
  4. package/dist/components/CTASection/index.d.ts +2 -0
  5. package/dist/components/CTASection/index.js +1 -0
  6. package/dist/components/Card/FlipCard.svelte +155 -0
  7. package/dist/components/Card/FlipCard.svelte.d.ts +13 -0
  8. package/dist/components/Card/index.d.ts +1 -0
  9. package/dist/components/Card/index.js +1 -0
  10. package/dist/components/Container/Container.svelte +1 -0
  11. package/dist/components/DataTable/DataTable.svelte +460 -0
  12. package/dist/components/DataTable/DataTable.svelte.d.ts +49 -0
  13. package/dist/components/DataTable/index.d.ts +2 -0
  14. package/dist/components/DataTable/index.js +1 -0
  15. package/dist/components/DoughnutChart/DoughnutChart.svelte +20 -2
  16. package/dist/components/GlobalHeader/GlobalHeader.svelte +692 -0
  17. package/dist/components/GlobalHeader/GlobalHeader.svelte.d.ts +3 -0
  18. package/dist/components/GlobalHeader/index.d.ts +2 -0
  19. package/dist/components/GlobalHeader/index.js +1 -0
  20. package/dist/components/Hero/Hero.svelte +306 -0
  21. package/dist/components/Hero/Hero.svelte.d.ts +18 -0
  22. package/dist/components/Hero/index.d.ts +2 -0
  23. package/dist/components/Hero/index.js +1 -0
  24. package/dist/components/Icon/Icon.svelte +15 -18
  25. package/dist/components/Icon/Icon.svelte.d.ts +2 -1
  26. package/dist/components/LogoCloud/LogoCloud.svelte +333 -0
  27. package/dist/components/LogoCloud/LogoCloud.svelte.d.ts +20 -0
  28. package/dist/components/LogoCloud/index.d.ts +2 -0
  29. package/dist/components/LogoCloud/index.js +1 -0
  30. package/dist/components/Menu/MenuContent.svelte +1 -0
  31. package/dist/components/Menu/MenuSubContent.svelte +1 -0
  32. package/dist/components/Mermaid/Mermaid.svelte +121 -7
  33. package/dist/components/Mermaid/Mermaid.svelte.d.ts +10 -0
  34. package/dist/components/PageHeader/PageHeader.svelte +140 -0
  35. package/dist/components/PageHeader/PageHeader.svelte.d.ts +30 -0
  36. package/dist/components/PageHeader/index.d.ts +1 -0
  37. package/dist/components/PageHeader/index.js +1 -0
  38. package/dist/components/ServiceCard/ServiceCard.svelte +359 -0
  39. package/dist/components/ServiceCard/ServiceCard.svelte.d.ts +16 -0
  40. package/dist/components/ServiceCard/index.d.ts +1 -0
  41. package/dist/components/ServiceCard/index.js +1 -0
  42. package/dist/components/SplitSection/SplitSection.svelte +194 -0
  43. package/dist/components/SplitSection/SplitSection.svelte.d.ts +15 -0
  44. package/dist/components/SplitSection/index.d.ts +1 -0
  45. package/dist/components/SplitSection/index.js +1 -0
  46. package/dist/components/StatCircle/StatCircle.svelte +172 -0
  47. package/dist/components/StatCircle/StatCircle.svelte.d.ts +19 -0
  48. package/dist/components/StatCircle/index.d.ts +1 -0
  49. package/dist/components/StatCircle/index.js +1 -0
  50. package/dist/components/StatsCard/StatsCard.svelte +301 -0
  51. package/dist/components/StatsCard/StatsCard.svelte.d.ts +32 -0
  52. package/dist/components/StatsCard/index.d.ts +2 -0
  53. package/dist/components/StatsCard/index.js +1 -0
  54. package/dist/components/StatusBadge/StatusBadge.svelte +221 -0
  55. package/dist/components/StatusBadge/StatusBadge.svelte.d.ts +22 -0
  56. package/dist/components/StatusBadge/index.d.ts +2 -0
  57. package/dist/components/StatusBadge/index.js +1 -0
  58. package/dist/components/StatusBanner/StatusBanner.svelte +325 -0
  59. package/dist/components/StatusBanner/StatusBanner.svelte.d.ts +13 -0
  60. package/dist/components/StatusBanner/index.d.ts +1 -0
  61. package/dist/components/StatusBanner/index.js +1 -0
  62. package/dist/components/TestimonialCard/TestimonialCard.svelte +290 -0
  63. package/dist/components/TestimonialCard/TestimonialCard.svelte.d.ts +14 -0
  64. package/dist/components/TestimonialCard/index.d.ts +1 -0
  65. package/dist/components/TestimonialCard/index.js +1 -0
  66. package/dist/components/Timeline/Timeline.svelte +444 -0
  67. package/dist/components/Timeline/Timeline.svelte.d.ts +19 -0
  68. package/dist/components/Timeline/index.d.ts +2 -0
  69. package/dist/components/Timeline/index.js +1 -0
  70. package/dist/index.d.ts +24 -2
  71. package/dist/index.js +16 -1
  72. package/dist/types/data-display.d.ts +72 -0
  73. package/dist/types/feedback.d.ts +10 -0
  74. package/dist/types/index.d.ts +2 -2
  75. package/package.json +3 -2
@@ -29,6 +29,7 @@
29
29
  position: relative;
30
30
  width: 100%;
31
31
  font-family: inherit;
32
+ box-sizing: border-box;
32
33
  }
33
34
 
34
35
  .aspect-ratio > :global(*) {
@@ -0,0 +1,298 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ export interface CTASectionProps {
5
+ title: string;
6
+ description?: string;
7
+ variant?: 'default' | 'gradient' | 'image' | 'split';
8
+ background?: string;
9
+ align?: 'left' | 'center' | 'right';
10
+ size?: 'sm' | 'md' | 'lg';
11
+ class?: string;
12
+ actions: Snippet;
13
+ icon?: Snippet;
14
+ }
15
+
16
+ let {
17
+ title,
18
+ description,
19
+ variant = 'default',
20
+ background,
21
+ align = 'center',
22
+ size = 'md',
23
+ class: className = '',
24
+ actions,
25
+ icon
26
+ }: CTASectionProps = $props();
27
+
28
+ const sizeClasses = {
29
+ sm: 'cta-section--sm',
30
+ md: 'cta-section--md',
31
+ lg: 'cta-section--lg'
32
+ };
33
+ </script>
34
+
35
+ <section
36
+ class="cta-section cta-section--{variant} cta-section--{align} {sizeClasses[size]} {className}"
37
+ style:--cta-background={background}
38
+ >
39
+ <div class="cta-section__container">
40
+ {#if variant === 'split' && icon}
41
+ <div class="cta-section__split">
42
+ <div class="cta-section__content">
43
+ <h2 class="cta-section__title">{title}</h2>
44
+ {#if description}
45
+ <p class="cta-section__description">{description}</p>
46
+ {/if}
47
+ <div class="cta-section__actions">
48
+ {@render actions()}
49
+ </div>
50
+ </div>
51
+ <div class="cta-section__icon">
52
+ {@render icon()}
53
+ </div>
54
+ </div>
55
+ {:else}
56
+ <div class="cta-section__content">
57
+ {#if icon && variant !== 'split'}
58
+ <div class="cta-section__icon">
59
+ {@render icon()}
60
+ </div>
61
+ {/if}
62
+ <h2 class="cta-section__title">{title}</h2>
63
+ {#if description}
64
+ <p class="cta-section__description">{description}</p>
65
+ {/if}
66
+ <div class="cta-section__actions">
67
+ {@render actions()}
68
+ </div>
69
+ </div>
70
+ {/if}
71
+ </div>
72
+ </section>
73
+
74
+ <style>
75
+ .cta-section {
76
+ --cta-bg: var(--color-primary, #0066cc);
77
+ --cta-text-color: var(--color-on-primary, #ffffff);
78
+ --cta-padding: 4rem;
79
+ --cta-max-width: 1200px;
80
+ --cta-gradient-from: var(--color-primary, #0066cc);
81
+ --cta-gradient-to: var(--color-primary-dark, #004999);
82
+
83
+ position: relative;
84
+ padding: var(--cta-padding) 1.5rem;
85
+ color: var(--cta-text-color);
86
+ overflow: hidden;
87
+ }
88
+
89
+ /* Variant: Default */
90
+ .cta-section--default {
91
+ background-color: var(--cta-background, var(--cta-bg));
92
+ }
93
+
94
+ /* Variant: Gradient */
95
+ .cta-section--gradient {
96
+ background: linear-gradient(
97
+ 135deg,
98
+ var(--cta-background, var(--cta-gradient-from)),
99
+ var(--cta-gradient-to)
100
+ );
101
+ }
102
+
103
+ /* Variant: Image */
104
+ .cta-section--image {
105
+ background-image: var(--cta-background);
106
+ background-size: cover;
107
+ background-position: center;
108
+ background-repeat: no-repeat;
109
+ }
110
+
111
+ .cta-section--image::before {
112
+ content: '';
113
+ position: absolute;
114
+ inset: 0;
115
+ background: rgba(0, 0, 0, 0.5);
116
+ z-index: 0;
117
+ }
118
+
119
+ .cta-section--image .cta-section__container {
120
+ position: relative;
121
+ z-index: 1;
122
+ }
123
+
124
+ /* Variant: Split */
125
+ .cta-section--split {
126
+ background-color: var(--cta-background, var(--cta-bg));
127
+ }
128
+
129
+ .cta-section__split {
130
+ display: grid;
131
+ grid-template-columns: 1fr;
132
+ gap: 2rem;
133
+ align-items: center;
134
+ }
135
+
136
+ @media (min-width: 768px) {
137
+ .cta-section__split {
138
+ grid-template-columns: 1fr 1fr;
139
+ gap: 3rem;
140
+ }
141
+ }
142
+
143
+ /* Size variants */
144
+ .cta-section--sm {
145
+ --cta-padding: 2rem;
146
+ }
147
+
148
+ .cta-section--md {
149
+ --cta-padding: 4rem;
150
+ }
151
+
152
+ .cta-section--lg {
153
+ --cta-padding: 6rem;
154
+ }
155
+
156
+ /* Container */
157
+ .cta-section__container {
158
+ max-width: var(--cta-max-width);
159
+ margin: 0 auto;
160
+ }
161
+
162
+ /* Content */
163
+ .cta-section__content {
164
+ display: flex;
165
+ flex-direction: column;
166
+ gap: 1.5rem;
167
+ }
168
+
169
+ /* Alignment */
170
+ .cta-section--left .cta-section__content {
171
+ align-items: flex-start;
172
+ text-align: left;
173
+ }
174
+
175
+ .cta-section--center .cta-section__content {
176
+ align-items: center;
177
+ text-align: center;
178
+ }
179
+
180
+ .cta-section--right .cta-section__content {
181
+ align-items: flex-end;
182
+ text-align: right;
183
+ }
184
+
185
+ /* Title */
186
+ .cta-section__title {
187
+ margin: 0;
188
+ font-size: clamp(1.75rem, 4vw, 2.5rem);
189
+ font-weight: 700;
190
+ line-height: 1.2;
191
+ color: inherit;
192
+ }
193
+
194
+ /* Description */
195
+ .cta-section__description {
196
+ margin: 0;
197
+ font-size: clamp(1rem, 2vw, 1.25rem);
198
+ line-height: 1.6;
199
+ max-width: 48rem;
200
+ opacity: 0.95;
201
+ }
202
+
203
+ /* Actions */
204
+ .cta-section__actions {
205
+ display: flex;
206
+ flex-wrap: wrap;
207
+ gap: 1rem;
208
+ margin-top: 0.5rem;
209
+ }
210
+
211
+ .cta-section--left .cta-section__actions {
212
+ justify-content: flex-start;
213
+ }
214
+
215
+ .cta-section--center .cta-section__actions {
216
+ justify-content: center;
217
+ }
218
+
219
+ .cta-section--right .cta-section__actions {
220
+ justify-content: flex-end;
221
+ }
222
+
223
+ /* Icon */
224
+ .cta-section__icon {
225
+ display: flex;
226
+ align-items: center;
227
+ justify-content: center;
228
+ margin-bottom: 0.5rem;
229
+ }
230
+
231
+ .cta-section--split .cta-section__icon {
232
+ margin-bottom: 0;
233
+ min-height: 300px;
234
+ }
235
+
236
+ .cta-section--left .cta-section__icon {
237
+ margin-left: 0;
238
+ margin-right: auto;
239
+ }
240
+
241
+ .cta-section--center .cta-section__icon {
242
+ margin-left: auto;
243
+ margin-right: auto;
244
+ }
245
+
246
+ .cta-section--right .cta-section__icon {
247
+ margin-left: auto;
248
+ margin-right: 0;
249
+ }
250
+
251
+ /* Focus visible for interactive elements */
252
+ .cta-section__actions :global(a:focus-visible),
253
+ .cta-section__actions :global(button:focus-visible) {
254
+ outline: 2px solid currentColor;
255
+ outline-offset: 2px;
256
+ }
257
+
258
+ /* Mobile optimization */
259
+ @media (max-width: 767px) {
260
+ .cta-section {
261
+ padding-left: 1rem;
262
+ padding-right: 1rem;
263
+ }
264
+
265
+ .cta-section--sm {
266
+ --cta-padding: 1.5rem;
267
+ }
268
+
269
+ .cta-section--md {
270
+ --cta-padding: 2.5rem;
271
+ }
272
+
273
+ .cta-section--lg {
274
+ --cta-padding: 4rem;
275
+ }
276
+
277
+ .cta-section__actions {
278
+ width: 100%;
279
+ }
280
+
281
+ .cta-section__actions :global(a),
282
+ .cta-section__actions :global(button) {
283
+ min-height: 44px;
284
+ min-width: 44px;
285
+ }
286
+ }
287
+
288
+ /* Dark mode support */
289
+ @media (prefers-color-scheme: dark) {
290
+ .cta-section--default {
291
+ --cta-bg: var(--color-primary-dark, #004999);
292
+ }
293
+
294
+ .cta-section--image::before {
295
+ background: rgba(0, 0, 0, 0.65);
296
+ }
297
+ }
298
+ </style>
@@ -0,0 +1,15 @@
1
+ import type { Snippet } from 'svelte';
2
+ export interface CTASectionProps {
3
+ title: string;
4
+ description?: string;
5
+ variant?: 'default' | 'gradient' | 'image' | 'split';
6
+ background?: string;
7
+ align?: 'left' | 'center' | 'right';
8
+ size?: 'sm' | 'md' | 'lg';
9
+ class?: string;
10
+ actions: Snippet;
11
+ icon?: Snippet;
12
+ }
13
+ declare const CTASection: import("svelte").Component<CTASectionProps, {}, "">;
14
+ type CTASection = ReturnType<typeof CTASection>;
15
+ export default CTASection;
@@ -0,0 +1,2 @@
1
+ export { default as CTASection } from './CTASection.svelte';
2
+ export type { CTASectionProps } from './CTASection.svelte';
@@ -0,0 +1 @@
1
+ export { default as CTASection } from './CTASection.svelte';
@@ -0,0 +1,155 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ /** Manually control flipped state */
4
+ flipped?: boolean;
5
+ /** Additional CSS classes */
6
+ class?: string;
7
+ /** Front side content */
8
+ front?: import('svelte').Snippet;
9
+ /** Back side content */
10
+ back?: import('svelte').Snippet;
11
+ }
12
+
13
+ let { flipped = $bindable(false), class: className = '', front, back }: Props = $props();
14
+
15
+ function handleClick() {
16
+ flipped = !flipped;
17
+ }
18
+
19
+ function handleKeydown(event: KeyboardEvent) {
20
+ if (event.key === ' ' || event.key === 'Enter') {
21
+ event.preventDefault();
22
+ flipped = !flipped;
23
+ }
24
+ }
25
+ </script>
26
+
27
+ <div
28
+ class="flip-card {flipped ? 'flip-card--flipped' : ''} {className}"
29
+ role="button"
30
+ tabindex="0"
31
+ aria-pressed={flipped}
32
+ aria-label={flipped ? 'Flip card to front' : 'Flip card to back'}
33
+ onclick={handleClick}
34
+ onkeydown={handleKeydown}
35
+ >
36
+ <div class="flip-card__inner">
37
+ <div class="flip-card__face flip-card__front">
38
+ {#if front}
39
+ {@render front()}
40
+ {/if}
41
+ </div>
42
+ <div class="flip-card__face flip-card__back">
43
+ {#if back}
44
+ {@render back()}
45
+ {/if}
46
+ </div>
47
+ </div>
48
+ </div>
49
+
50
+ <style>
51
+ .flip-card {
52
+ perspective: 1000px;
53
+ position: relative;
54
+ width: 100%;
55
+ min-height: 12.5rem;
56
+ cursor: pointer;
57
+ font-family: inherit;
58
+ outline: none;
59
+ }
60
+
61
+ .flip-card:focus-visible {
62
+ outline: 2px solid var(--color-primary, #007bff);
63
+ outline-offset: 2px;
64
+ }
65
+
66
+ .flip-card__inner {
67
+ position: relative;
68
+ width: 100%;
69
+ height: 100%;
70
+ min-height: inherit;
71
+ transition: transform 0.6s;
72
+ transform-style: preserve-3d;
73
+ }
74
+
75
+ .flip-card--flipped .flip-card__inner {
76
+ transform: rotateY(180deg);
77
+ }
78
+
79
+ .flip-card__face {
80
+ position: absolute;
81
+ width: 100%;
82
+ height: 100%;
83
+ min-height: inherit;
84
+ backface-visibility: hidden;
85
+ -webkit-backface-visibility: hidden;
86
+ background: var(--color-bg-card, #ffffff);
87
+ border-radius: var(--radius-lg, 0.5rem);
88
+ overflow: hidden;
89
+ box-shadow: var(
90
+ --shadow-md,
91
+ 0 4px 6px -1px rgba(0, 0, 0, 0.1),
92
+ 0 2px 4px -1px rgba(0, 0, 0, 0.06)
93
+ );
94
+ }
95
+
96
+ .flip-card__front {
97
+ z-index: 2;
98
+ }
99
+
100
+ .flip-card__back {
101
+ transform: rotateY(180deg);
102
+ }
103
+
104
+ /* Dark mode support */
105
+ @media (prefers-color-scheme: dark) {
106
+ .flip-card__face {
107
+ background: var(--color-bg-card, #1e1e1e);
108
+ box-shadow: var(
109
+ --shadow-md,
110
+ 0 4px 6px -1px rgba(0, 0, 0, 0.3),
111
+ 0 2px 4px -1px rgba(0, 0, 0, 0.2)
112
+ );
113
+ }
114
+ }
115
+
116
+ /* Reduced motion fallback */
117
+ @media (prefers-reduced-motion: reduce) {
118
+ .flip-card__inner {
119
+ transition: opacity 0.3s;
120
+ transform: none;
121
+ }
122
+
123
+ .flip-card--flipped .flip-card__inner {
124
+ transform: none;
125
+ }
126
+
127
+ .flip-card__front {
128
+ opacity: 1;
129
+ transition: opacity 0.3s;
130
+ }
131
+
132
+ .flip-card--flipped .flip-card__front {
133
+ opacity: 0;
134
+ pointer-events: none;
135
+ }
136
+
137
+ .flip-card__back {
138
+ transform: none;
139
+ opacity: 0;
140
+ transition: opacity 0.3s;
141
+ }
142
+
143
+ .flip-card--flipped .flip-card__back {
144
+ opacity: 1;
145
+ pointer-events: auto;
146
+ }
147
+ }
148
+
149
+ /* Ensure touch targets meet 44px minimum */
150
+ @media (hover: none) and (pointer: coarse) {
151
+ .flip-card {
152
+ min-height: 2.75rem; /* 44px */
153
+ }
154
+ }
155
+ </style>
@@ -0,0 +1,13 @@
1
+ interface Props {
2
+ /** Manually control flipped state */
3
+ flipped?: boolean;
4
+ /** Additional CSS classes */
5
+ class?: string;
6
+ /** Front side content */
7
+ front?: import('svelte').Snippet;
8
+ /** Back side content */
9
+ back?: import('svelte').Snippet;
10
+ }
11
+ declare const FlipCard: import("svelte").Component<Props, {}, "flipped">;
12
+ type FlipCard = ReturnType<typeof FlipCard>;
13
+ export default FlipCard;
@@ -2,3 +2,4 @@ export { default as Card } from './Card.svelte';
2
2
  export { default as CardHeader } from './CardHeader.svelte';
3
3
  export { default as CardBody } from './CardBody.svelte';
4
4
  export { default as CardFooter } from './CardFooter.svelte';
5
+ export { default as FlipCard } from './FlipCard.svelte';
@@ -2,3 +2,4 @@ export { default as Card } from './Card.svelte';
2
2
  export { default as CardHeader } from './CardHeader.svelte';
3
3
  export { default as CardBody } from './CardBody.svelte';
4
4
  export { default as CardFooter } from './CardFooter.svelte';
5
+ export { default as FlipCard } from './FlipCard.svelte';
@@ -22,6 +22,7 @@
22
22
  width: 100%;
23
23
  padding: var(--space-md, 1rem);
24
24
  font-family: inherit;
25
+ box-sizing: border-box;
25
26
  }
26
27
 
27
28
  .container[data-centered='true'] {