seblify 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 (47) hide show
  1. package/README.md +118 -45
  2. package/dist/components/action/input/select/checkbox/Checkbox.svelte +378 -16
  3. package/dist/components/action/input/select/checkbox/Checkbox.svelte.d.ts +7 -0
  4. package/dist/components/action/input/select/checkbox/checkbox-relations.svelte.d.ts +47 -0
  5. package/dist/components/action/input/select/checkbox/checkbox-relations.svelte.js +154 -0
  6. package/dist/components/action/input/select/switch/Switch.svelte +349 -40
  7. package/dist/components/action/input/select/switch/Switch.svelte.d.ts +8 -3
  8. package/dist/components/display/annotation/tag/Tag.svelte +19 -0
  9. package/dist/components/display/data-display/metric/duration/Duration.svelte +64 -0
  10. package/dist/components/display/data-display/metric/duration/Duration.svelte.d.ts +16 -0
  11. package/dist/components/display/data-display/metric/relative-time/RelativeTime.svelte +104 -0
  12. package/dist/components/display/data-display/metric/relative-time/RelativeTime.svelte.d.ts +16 -0
  13. package/dist/components/display/data-display/visual/timeline/TimelineItem.svelte +19 -0
  14. package/dist/components/display/feedback/loading/loading-dots/LoadingDots.svelte +19 -0
  15. package/dist/components/display/feedback/loading/spinner/Spinner.svelte +19 -0
  16. package/dist/components/display/motion/collapse/Collapse.svelte +115 -0
  17. package/dist/components/display/motion/collapse/Collapse.svelte.d.ts +17 -0
  18. package/dist/components/display/typography/accordion/Accordion.svelte +347 -0
  19. package/dist/components/display/typography/accordion/Accordion.svelte.d.ts +13 -0
  20. package/dist/components/display/typography/accordion/AccordionGroup.svelte +132 -0
  21. package/dist/components/display/typography/accordion/AccordionGroup.svelte.d.ts +11 -0
  22. package/dist/components/display/typography/accordion/context.d.ts +8 -0
  23. package/dist/components/display/typography/accordion/context.js +8 -0
  24. package/dist/components/framework/overlay/tooltip/Tooltip.svelte +1012 -0
  25. package/dist/components/framework/overlay/tooltip/Tooltip.svelte.d.ts +31 -0
  26. package/dist/components/utility/format/duration/formatDuration.d.ts +15 -0
  27. package/dist/components/utility/format/duration/formatDuration.js +218 -0
  28. package/dist/components/utility/format/relative-time/formatRelativeTime.d.ts +35 -0
  29. package/dist/components/utility/format/relative-time/formatRelativeTime.js +343 -0
  30. package/dist/design-system/reserved-props/allowed-options.d.ts +6 -3
  31. package/dist/design-system/theme/tokens.js +48 -0
  32. package/dist/icons/generated/check-thick.svelte +16 -0
  33. package/dist/icons/generated/check-thick.svelte.d.ts +7 -0
  34. package/dist/icons/generated/check.svelte +16 -0
  35. package/dist/icons/generated/check.svelte.d.ts +7 -0
  36. package/dist/icons/generated/close-thick.svelte +16 -0
  37. package/dist/icons/generated/close-thick.svelte.d.ts +7 -0
  38. package/dist/icons/generated/close.svelte +16 -0
  39. package/dist/icons/generated/close.svelte.d.ts +7 -0
  40. package/dist/icons/generated/index.d.ts +4 -0
  41. package/dist/icons/generated/index.js +4 -0
  42. package/dist/icons/generated/manifest.js +28 -0
  43. package/dist/index.d.ts +9 -0
  44. package/dist/index.js +9 -0
  45. package/dist/styles/tone-context.css +19 -0
  46. package/dist/theme.css +22 -0
  47. package/package.json +15 -3
@@ -0,0 +1,64 @@
1
+ <script lang="ts">
2
+ import type {
3
+ DurationFormat,
4
+ DurationRounding,
5
+ DurationStyle,
6
+ DurationUnit,
7
+ FormatDurationOptions,
8
+ } from '../../../../utility/format/duration/formatDuration';
9
+ import { formatDuration } from '../../../../utility/format/duration/formatDuration';
10
+ import type { SeblifyProps } from 'seblify';
11
+
12
+ type Props = SeblifyProps<{
13
+ [key: string]: unknown;
14
+ class?: string;
15
+ format?: DurationFormat;
16
+ largestUnit?: DurationUnit;
17
+ locale?: Intl.LocalesArgument;
18
+ maxUnits?: number;
19
+ minUnits?: number;
20
+ rounding?: DurationRounding;
21
+ smallestUnit?: DurationUnit;
22
+ unitStyle?: DurationStyle;
23
+ value: number;
24
+ }>;
25
+
26
+ let {
27
+ class: className,
28
+ format = 'unit',
29
+ largestUnit = 'day',
30
+ locale,
31
+ maxUnits = 2,
32
+ minUnits = 1,
33
+ rounding,
34
+ smallestUnit = 'second',
35
+ unitStyle = 'long',
36
+ value,
37
+ ...restProps
38
+ }: Props = $props();
39
+
40
+ const formatterOptions = $derived<FormatDurationOptions>({
41
+ format,
42
+ largestUnit,
43
+ locale,
44
+ maxUnits,
45
+ minUnits,
46
+ rounding,
47
+ smallestUnit,
48
+ style: unitStyle,
49
+ });
50
+ const text = $derived(formatDuration(value, formatterOptions));
51
+ </script>
52
+
53
+ <span
54
+ {...restProps}
55
+ class={`duration${className ? ` ${className}` : ''}`}
56
+ >
57
+ {text}
58
+ </span>
59
+
60
+ <style>
61
+ .duration {
62
+ white-space: nowrap;
63
+ }
64
+ </style>
@@ -0,0 +1,16 @@
1
+ import type { DurationFormat, DurationRounding, DurationStyle, DurationUnit } from '../../../../utility/format/duration/formatDuration';
2
+ declare const Duration: import("svelte").Component<{
3
+ [x: string]: unknown;
4
+ class?: string | undefined;
5
+ format?: DurationFormat | undefined;
6
+ largestUnit?: DurationUnit | undefined;
7
+ locale?: Intl.LocalesArgument;
8
+ maxUnits?: number | undefined;
9
+ minUnits?: number | undefined;
10
+ rounding?: DurationRounding | undefined;
11
+ smallestUnit?: DurationUnit | undefined;
12
+ unitStyle?: DurationStyle | undefined;
13
+ value: number;
14
+ }, {}, "">;
15
+ type Duration = ReturnType<typeof Duration>;
16
+ export default Duration;
@@ -0,0 +1,104 @@
1
+ <script lang="ts">
2
+ import type {
3
+ FormatRelativeTimeOptions,
4
+ RelativeTimeInput,
5
+ RelativeTimeLabel,
6
+ RelativeTimeMode,
7
+ RelativeTimePresentation,
8
+ RelativeTimeStyle,
9
+ RelativeTimeUnitSteps,
10
+ } from '../../../../utility/format/relative-time/formatRelativeTime';
11
+ import {
12
+ formatRelativeTime,
13
+ getRelativeTimeState,
14
+ relativeTimeDateTime,
15
+ } from '../../../../utility/format/relative-time/formatRelativeTime';
16
+ import type { SeblifyProps } from 'seblify';
17
+
18
+ type Props = SeblifyProps<{
19
+ [key: string]: unknown;
20
+ class?: string;
21
+ from?: RelativeTimeInput;
22
+ labels?: readonly RelativeTimeLabel[];
23
+ locale?: Intl.LocalesArgument;
24
+ mode?: RelativeTimeMode;
25
+ presentation?: RelativeTimePresentation;
26
+ unitStyle?: RelativeTimeStyle;
27
+ unitSteps?: RelativeTimeUnitSteps;
28
+ update?: 'auto' | false | number;
29
+ value: RelativeTimeInput;
30
+ }>;
31
+
32
+ let {
33
+ class: className,
34
+ from,
35
+ labels,
36
+ locale,
37
+ mode = 'time',
38
+ presentation = 'relative',
39
+ unitStyle = 'long',
40
+ unitSteps = 'detailed',
41
+ update = 'auto',
42
+ value,
43
+ ...restProps
44
+ }: Props = $props();
45
+
46
+ let currentFrom = $state(new Date());
47
+ let updateTimer: ReturnType<typeof window.setTimeout> | undefined;
48
+
49
+ const formatterOptions = $derived<FormatRelativeTimeOptions>({
50
+ from: from ?? currentFrom,
51
+ labels,
52
+ locale,
53
+ mode,
54
+ presentation,
55
+ style: unitStyle,
56
+ unitSteps,
57
+ });
58
+ const text = $derived(formatRelativeTime(value, formatterOptions));
59
+ const dateTime = $derived(relativeTimeDateTime(value));
60
+
61
+ function clearUpdateTimer(): void {
62
+ if (updateTimer === undefined) {
63
+ return;
64
+ }
65
+
66
+ window.clearTimeout(updateTimer);
67
+ updateTimer = undefined;
68
+ }
69
+
70
+ function updateCurrentFrom(): void {
71
+ currentFrom = new Date();
72
+ }
73
+
74
+ $effect(() => {
75
+ clearUpdateTimer();
76
+
77
+ if (from !== undefined || update === false) {
78
+ return;
79
+ }
80
+
81
+ const delay =
82
+ update === 'auto'
83
+ ? getRelativeTimeState(value, formatterOptions).updateInMilliseconds
84
+ : Math.max(1, update);
85
+
86
+ updateTimer = window.setTimeout(updateCurrentFrom, delay);
87
+
88
+ return clearUpdateTimer;
89
+ });
90
+ </script>
91
+
92
+ <time
93
+ {...restProps}
94
+ class={`relative-time${className ? ` ${className}` : ''}`}
95
+ datetime={dateTime}
96
+ >
97
+ {text}
98
+ </time>
99
+
100
+ <style>
101
+ .relative-time {
102
+ white-space: nowrap;
103
+ }
104
+ </style>
@@ -0,0 +1,16 @@
1
+ import type { RelativeTimeInput, RelativeTimeLabel, RelativeTimeMode, RelativeTimePresentation, RelativeTimeStyle, RelativeTimeUnitSteps } from '../../../../utility/format/relative-time/formatRelativeTime';
2
+ declare const RelativeTime: import("svelte").Component<{
3
+ [x: string]: unknown;
4
+ class?: string | undefined;
5
+ from?: RelativeTimeInput | undefined;
6
+ labels?: readonly RelativeTimeLabel[] | undefined;
7
+ locale?: Intl.LocalesArgument;
8
+ mode?: RelativeTimeMode | undefined;
9
+ presentation?: RelativeTimePresentation | undefined;
10
+ unitStyle?: RelativeTimeStyle | undefined;
11
+ unitSteps?: RelativeTimeUnitSteps | undefined;
12
+ update?: "auto" | false | number | undefined;
13
+ value: RelativeTimeInput;
14
+ }, {}, "">;
15
+ type RelativeTime = ReturnType<typeof RelativeTime>;
16
+ export default RelativeTime;
@@ -174,6 +174,14 @@
174
174
  --seblify-tone-border: var(--seblify-color-border, #c8d2df);
175
175
  }
176
176
 
177
+ :where(.seblify-tone-context[data-seblify-tone='strong']) {
178
+ --seblify-tone-fill: var(--seblify-color-fill-strong, #172033);
179
+ --seblify-tone-fill-text: var(--seblify-color-fill-strong-text, #ffffff);
180
+ --seblify-tone-surface: var(--seblify-color-surface-raised, #ffffff);
181
+ --seblify-tone-text: var(--seblify-color-text, #172033);
182
+ --seblify-tone-border: var(--seblify-color-border-strong, #aab7c5);
183
+ }
184
+
177
185
  :where(.seblify-tone-context[data-seblify-tone='primary']) {
178
186
  --seblify-tone-fill: var(--seblify-color-fill-primary, #146a6f);
179
187
  --seblify-tone-fill-text: var(--seblify-color-fill-primary-text, #ffffff);
@@ -182,6 +190,17 @@
182
190
  --seblify-tone-border: var(--seblify-color-border-accent, #9ab7ba);
183
191
  }
184
192
 
193
+ :where(.seblify-tone-context[data-seblify-tone='secondary']) {
194
+ --seblify-tone-fill: var(--seblify-color-fill-secondary, #5b5fc7);
195
+ --seblify-tone-fill-text: var(
196
+ --seblify-color-fill-secondary-text,
197
+ #ffffff
198
+ );
199
+ --seblify-tone-surface: var(--seblify-color-secondary-surface, #f0efff);
200
+ --seblify-tone-text: var(--seblify-color-secondary-text, #2f316f);
201
+ --seblify-tone-border: var(--seblify-color-secondary-border, #c8c6f4);
202
+ }
203
+
185
204
  :where(.seblify-tone-context[data-seblify-tone='success']) {
186
205
  --seblify-tone-fill: var(--seblify-color-fill-success, #1f7a3f);
187
206
  --seblify-tone-fill-text: var(--seblify-color-fill-success-text, #ffffff);
@@ -73,6 +73,14 @@
73
73
  --seblify-tone-border: var(--seblify-color-border, #c8d2df);
74
74
  }
75
75
 
76
+ :where(.seblify-tone-context[data-seblify-tone='strong']) {
77
+ --seblify-tone-fill: var(--seblify-color-fill-strong, #172033);
78
+ --seblify-tone-fill-text: var(--seblify-color-fill-strong-text, #ffffff);
79
+ --seblify-tone-surface: var(--seblify-color-surface-raised, #ffffff);
80
+ --seblify-tone-text: var(--seblify-color-text, #172033);
81
+ --seblify-tone-border: var(--seblify-color-border-strong, #aab7c5);
82
+ }
83
+
76
84
  :where(.seblify-tone-context[data-seblify-tone='primary']) {
77
85
  --seblify-tone-fill: var(--seblify-color-fill-primary, #146a6f);
78
86
  --seblify-tone-fill-text: var(--seblify-color-fill-primary-text, #ffffff);
@@ -81,6 +89,17 @@
81
89
  --seblify-tone-border: var(--seblify-color-border-accent, #9ab7ba);
82
90
  }
83
91
 
92
+ :where(.seblify-tone-context[data-seblify-tone='secondary']) {
93
+ --seblify-tone-fill: var(--seblify-color-fill-secondary, #5b5fc7);
94
+ --seblify-tone-fill-text: var(
95
+ --seblify-color-fill-secondary-text,
96
+ #ffffff
97
+ );
98
+ --seblify-tone-surface: var(--seblify-color-secondary-surface, #f0efff);
99
+ --seblify-tone-text: var(--seblify-color-secondary-text, #2f316f);
100
+ --seblify-tone-border: var(--seblify-color-secondary-border, #c8c6f4);
101
+ }
102
+
84
103
  :where(.seblify-tone-context[data-seblify-tone='success']) {
85
104
  --seblify-tone-fill: var(--seblify-color-fill-success, #1f7a3f);
86
105
  --seblify-tone-fill-text: var(--seblify-color-fill-success-text, #ffffff);
@@ -69,6 +69,14 @@
69
69
  --seblify-tone-border: var(--seblify-color-border, #c8d2df);
70
70
  }
71
71
 
72
+ :where(.seblify-tone-context[data-seblify-tone='strong']) {
73
+ --seblify-tone-fill: var(--seblify-color-fill-strong, #172033);
74
+ --seblify-tone-fill-text: var(--seblify-color-fill-strong-text, #ffffff);
75
+ --seblify-tone-surface: var(--seblify-color-surface-raised, #ffffff);
76
+ --seblify-tone-text: var(--seblify-color-text, #172033);
77
+ --seblify-tone-border: var(--seblify-color-border-strong, #aab7c5);
78
+ }
79
+
72
80
  :where(.seblify-tone-context[data-seblify-tone='primary']) {
73
81
  --seblify-tone-fill: var(--seblify-color-fill-primary, #146a6f);
74
82
  --seblify-tone-fill-text: var(--seblify-color-fill-primary-text, #ffffff);
@@ -77,6 +85,17 @@
77
85
  --seblify-tone-border: var(--seblify-color-border-accent, #9ab7ba);
78
86
  }
79
87
 
88
+ :where(.seblify-tone-context[data-seblify-tone='secondary']) {
89
+ --seblify-tone-fill: var(--seblify-color-fill-secondary, #5b5fc7);
90
+ --seblify-tone-fill-text: var(
91
+ --seblify-color-fill-secondary-text,
92
+ #ffffff
93
+ );
94
+ --seblify-tone-surface: var(--seblify-color-secondary-surface, #f0efff);
95
+ --seblify-tone-text: var(--seblify-color-secondary-text, #2f316f);
96
+ --seblify-tone-border: var(--seblify-color-secondary-border, #c8c6f4);
97
+ }
98
+
80
99
  :where(.seblify-tone-context[data-seblify-tone='success']) {
81
100
  --seblify-tone-fill: var(--seblify-color-fill-success, #1f7a3f);
82
101
  --seblify-tone-fill-text: var(--seblify-color-fill-success-text, #ffffff);
@@ -0,0 +1,115 @@
1
+ <script lang="ts">
2
+ import type { CustomCssSize, SeblifyProps } from 'seblify';
3
+ import type { Snippet } from 'svelte';
4
+
5
+ type CollapseElement = keyof HTMLElementTagNameMap;
6
+
7
+ type Props = SeblifyProps<{
8
+ [key: string]: unknown;
9
+ as?: CollapseElement;
10
+ children?: Snippet;
11
+ class?: string;
12
+ closeEasing?: string;
13
+ collapsedHeight?: number | CustomCssSize;
14
+ duration?: number;
15
+ easing?: string;
16
+ expanded?: boolean;
17
+ openEasing?: string;
18
+ }>;
19
+
20
+ let {
21
+ as = 'div',
22
+ children,
23
+ class: className,
24
+ closeEasing = 'cubic-bezier(0, 0, 0.2, 1)',
25
+ collapsedHeight = 0,
26
+ duration = 220,
27
+ easing,
28
+ expanded = false,
29
+ openEasing = 'cubic-bezier(0, 0, 0.2, 1)',
30
+ ...restProps
31
+ }: Props = $props();
32
+
33
+ let contentElement: HTMLDivElement | undefined;
34
+ let measuredHeight = $state(0);
35
+
36
+ function cssLength(value: number | CustomCssSize): string {
37
+ return typeof value === 'number' ? `${Math.max(0, value)}px` : value;
38
+ }
39
+
40
+ function cssDuration(value: number): string {
41
+ if (!Number.isFinite(value)) {
42
+ return '0ms';
43
+ }
44
+
45
+ return `${Math.max(0, value)}ms`;
46
+ }
47
+
48
+ function measureContentHeight() {
49
+ measuredHeight = contentElement?.scrollHeight ?? 0;
50
+ }
51
+
52
+ const collapsedHeightValue = $derived(cssLength(collapsedHeight));
53
+ const durationValue = $derived(cssDuration(duration));
54
+ const expandedHeightValue = $derived(`${measuredHeight}px`);
55
+ const resolvedHeight = $derived(
56
+ expanded ? expandedHeightValue : collapsedHeightValue,
57
+ );
58
+ const resolvedEasing = $derived(
59
+ easing ?? (expanded ? openEasing : closeEasing),
60
+ );
61
+
62
+ $effect(() => {
63
+ if (!contentElement) {
64
+ return;
65
+ }
66
+
67
+ measureContentHeight();
68
+
69
+ if (typeof ResizeObserver === 'undefined') {
70
+ return;
71
+ }
72
+
73
+ const observer = new ResizeObserver(measureContentHeight);
74
+ observer.observe(contentElement);
75
+
76
+ return () => {
77
+ observer.disconnect();
78
+ };
79
+ });
80
+ </script>
81
+
82
+ <svelte:element
83
+ this={as}
84
+ {...restProps}
85
+ class={`collapse${className ? ` ${className}` : ''}`}
86
+ data-state={expanded ? 'expanded' : 'collapsed'}
87
+ style:--collapse-collapsed-height={collapsedHeightValue}
88
+ style:--collapse-duration={durationValue}
89
+ style:--collapse-easing={resolvedEasing}
90
+ style:--collapse-expanded-height={expandedHeightValue}
91
+ style:--collapse-height={resolvedHeight}
92
+ >
93
+ <div class="collapse__content" bind:this={contentElement}>
94
+ {@render children?.()}
95
+ </div>
96
+ </svelte:element>
97
+
98
+ <style>
99
+ .collapse {
100
+ display: block;
101
+ height: var(--collapse-height);
102
+ overflow: hidden;
103
+ transition: height var(--collapse-duration) var(--collapse-easing);
104
+ }
105
+
106
+ .collapse__content {
107
+ min-height: 0;
108
+ }
109
+
110
+ @media (prefers-reduced-motion: reduce) {
111
+ .collapse {
112
+ transition-duration: 0ms;
113
+ }
114
+ }
115
+ </style>
@@ -0,0 +1,17 @@
1
+ import type { CustomCssSize } from 'seblify';
2
+ import type { Snippet } from 'svelte';
3
+ type CollapseElement = keyof HTMLElementTagNameMap;
4
+ declare const Collapse: import("svelte").Component<{
5
+ [x: string]: unknown;
6
+ as?: CollapseElement | undefined;
7
+ children?: Snippet | undefined;
8
+ class?: string | undefined;
9
+ closeEasing?: string | undefined;
10
+ collapsedHeight?: (number | CustomCssSize) | undefined;
11
+ duration?: number | undefined;
12
+ easing?: string | undefined;
13
+ expanded?: boolean | undefined;
14
+ openEasing?: string | undefined;
15
+ }, {}, "">;
16
+ type Collapse = ReturnType<typeof Collapse>;
17
+ export default Collapse;