@picked/svelte 0.0.45-next.1 → 0.0.45-next.3
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/dist/plugins/devtools/DevToolsExperience.svelte +61 -44
- package/dist/plugins/devtools/components/ExperienceInstanceListItem.svelte +2 -1
- package/dist/plugins/devtools/components/ExperienceInstancesTable.svelte +22 -20
- package/dist/plugins/devtools/components/Tabs.svelte +20 -7
- package/dist/plugins/devtools/experience.js +1 -1
- package/dist/plugins/devtools/screens/components/ComponentsListScreen.svelte +18 -18
- package/dist/plugins/devtools/screens/events/EventListItem.svelte +28 -42
- package/dist/plugins/devtools/screens/events/EventsListScreen.svelte +10 -11
- package/dist/plugins/devtools/screens/events/EventsTable.svelte +31 -33
- package/dist/plugins/devtools/screens/experiences/ExperienceDetailsScreen.svelte +13 -16
- package/dist/plugins/devtools/screens/experiences/ExperienceTreeScreen.svelte +20 -71
- package/dist/plugins/devtools/screens/features/FeaturesListScreen.svelte +96 -232
- package/dist/plugins/devtools/screens/frameworks/FrameworksListScreen.svelte +14 -16
- package/dist/plugins/devtools/screens/history/HistoryEntriesTable.svelte +18 -16
- package/dist/plugins/devtools/screens/predicates/PredicatesListScreen.svelte +14 -16
- package/dist/plugins/devtools/screens/responses/ResponseTableRow.svelte +25 -63
- package/dist/plugins/devtools/screens/responses/ResponsesTable.svelte +43 -64
- package/dist/plugins/devtools/ui/actions/Button.svelte +171 -0
- package/dist/plugins/devtools/ui/actions/CopyButton.svelte +88 -0
- package/dist/plugins/devtools/ui/data/Badge.svelte +62 -0
- package/dist/plugins/devtools/ui/data/CodeBlock.svelte +38 -0
- package/dist/plugins/devtools/ui/data/DataTable.svelte +134 -0
- package/dist/plugins/devtools/ui/data/EmptyState.svelte +26 -0
- package/dist/plugins/devtools/ui/data/ExpandableRow.svelte +66 -0
- package/dist/plugins/devtools/ui/data/VisualizationContainer.svelte +55 -0
- package/dist/plugins/devtools/ui/feedback/Banner.svelte +116 -0
- package/dist/plugins/devtools/ui/feedback/Spinner.svelte +79 -0
- package/dist/plugins/devtools/ui/forms/Checkbox.svelte +139 -0
- package/dist/plugins/devtools/ui/forms/RadioGroup.svelte +218 -0
- package/dist/plugins/devtools/ui/forms/Select.svelte +137 -0
- package/dist/plugins/devtools/ui/forms/Switch.svelte +158 -0
- package/dist/plugins/devtools/ui/forms/TextField.svelte +125 -0
- package/dist/plugins/devtools/ui/index.d.ts +22 -0
- package/dist/plugins/devtools/ui/index.js +1 -0
- package/dist/plugins/devtools/ui/layout/Card.svelte +55 -0
- package/dist/plugins/devtools/ui/layout/Divider.svelte +34 -0
- package/dist/plugins/devtools/ui/layout/Spacer.svelte +11 -0
- package/dist/plugins/devtools/ui/layout/Stack.svelte +129 -0
- package/dist/plugins/devtools/ui/overlays/Tooltip.svelte +90 -0
- package/dist/plugins/devtools/ui/tokens.css +144 -0
- package/dist/plugins/devtools/ui/tokens.css.js +1 -0
- package/dist/plugins/devtools/ui/typography/Heading.svelte +55 -0
- package/dist/plugins/devtools/ui/typography/Text.svelte +93 -0
- package/package.json +5 -2
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@paired-component apps/dashboard/src/shared/ui/layout/card.tsx
|
|
3
|
+
@design-parity Props, variants, sizes, and visual output must stay in sync
|
|
4
|
+
with the Dashboard React counterpart. When modifying this component, replicate
|
|
5
|
+
the change in the paired React component to maintain visual and behavioral parity.
|
|
6
|
+
-->
|
|
7
|
+
<script lang="ts">
|
|
8
|
+
import type { Snippet } from 'svelte'
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
children: Snippet
|
|
12
|
+
header?: Snippet
|
|
13
|
+
subdued?: boolean
|
|
14
|
+
sectioned?: boolean
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let { children, header, subdued = false, sectioned = false }: Props = $props()
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
<div class="card" class:subdued class:sectioned>
|
|
21
|
+
{#if header}
|
|
22
|
+
<div class="card-header">
|
|
23
|
+
{@render header()}
|
|
24
|
+
</div>
|
|
25
|
+
{/if}
|
|
26
|
+
<div class="card-body">
|
|
27
|
+
{@render children()}
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<style>
|
|
32
|
+
.card {
|
|
33
|
+
overflow: hidden;
|
|
34
|
+
border-radius: var(--radius-lg);
|
|
35
|
+
border: 1px solid var(--color-gray-200);
|
|
36
|
+
box-shadow: var(--shadow-card);
|
|
37
|
+
background-color: var(--color-white);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.card.subdued {
|
|
41
|
+
background-color: var(--color-gray-50);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.card:not(.sectioned) .card-body {
|
|
45
|
+
padding: var(--space-4);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.card-header {
|
|
49
|
+
display: flex;
|
|
50
|
+
align-items: center;
|
|
51
|
+
justify-content: space-between;
|
|
52
|
+
border-bottom: 1px solid var(--color-gray-200);
|
|
53
|
+
padding: var(--space-3) var(--space-4);
|
|
54
|
+
}
|
|
55
|
+
</style>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@paired-component apps/dashboard/src/shared/ui/layout/divider.tsx
|
|
3
|
+
@design-parity Props, variants, sizes, and visual output must stay in sync
|
|
4
|
+
with the Dashboard React counterpart. When modifying this component, replicate
|
|
5
|
+
the change in the paired React component to maintain visual and behavioral parity.
|
|
6
|
+
-->
|
|
7
|
+
<script lang="ts">
|
|
8
|
+
interface Props {
|
|
9
|
+
orientation?: 'horizontal' | 'vertical'
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
let { orientation = 'horizontal' }: Props = $props()
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
{#if orientation === 'horizontal'}
|
|
16
|
+
<hr class="divider-horizontal" />
|
|
17
|
+
{:else}
|
|
18
|
+
<div class="divider-vertical" role="separator" aria-orientation="vertical"></div>
|
|
19
|
+
{/if}
|
|
20
|
+
|
|
21
|
+
<style>
|
|
22
|
+
.divider-horizontal {
|
|
23
|
+
width: 100%;
|
|
24
|
+
border: none;
|
|
25
|
+
border-top: 1px solid var(--color-gray-200);
|
|
26
|
+
margin: 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.divider-vertical {
|
|
30
|
+
width: 1px;
|
|
31
|
+
align-self: stretch;
|
|
32
|
+
background-color: var(--color-gray-200);
|
|
33
|
+
}
|
|
34
|
+
</style>
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@paired-component apps/dashboard/src/shared/ui/layout/stack.tsx
|
|
3
|
+
@design-parity Props, variants, sizes, and visual output must stay in sync
|
|
4
|
+
with the Dashboard React counterpart. When modifying this component, replicate
|
|
5
|
+
the change in the paired React component to maintain visual and behavioral parity.
|
|
6
|
+
-->
|
|
7
|
+
<script lang="ts">
|
|
8
|
+
import type { Snippet } from 'svelte'
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
children: Snippet
|
|
12
|
+
direction?: 'horizontal' | 'vertical'
|
|
13
|
+
gap?: 'none' | 'small' | 'medium' | 'large'
|
|
14
|
+
align?: 'start' | 'center' | 'end' | 'space-between' | 'space-around' | 'space-evenly'
|
|
15
|
+
justify?: 'start' | 'center' | 'end' | 'stretch' | 'baseline'
|
|
16
|
+
wrap?: boolean
|
|
17
|
+
padding?: 'none' | 'small' | 'medium' | 'large'
|
|
18
|
+
fill?: boolean
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
let {
|
|
22
|
+
children,
|
|
23
|
+
direction = 'vertical',
|
|
24
|
+
gap = 'medium',
|
|
25
|
+
align = 'start',
|
|
26
|
+
justify = 'stretch',
|
|
27
|
+
wrap = false,
|
|
28
|
+
padding = 'none',
|
|
29
|
+
fill = false,
|
|
30
|
+
}: Props = $props()
|
|
31
|
+
</script>
|
|
32
|
+
|
|
33
|
+
<div
|
|
34
|
+
class="stack direction-{direction} gap-{gap} align-{align} justify-{justify} padding-{padding}"
|
|
35
|
+
class:wrap
|
|
36
|
+
class:fill
|
|
37
|
+
>
|
|
38
|
+
{@render children()}
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
<style>
|
|
42
|
+
.stack {
|
|
43
|
+
display: flex;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* Direction */
|
|
47
|
+
.direction-horizontal {
|
|
48
|
+
flex-direction: row;
|
|
49
|
+
}
|
|
50
|
+
.direction-vertical {
|
|
51
|
+
flex-direction: column;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* Gap */
|
|
55
|
+
.gap-none {
|
|
56
|
+
gap: 0;
|
|
57
|
+
}
|
|
58
|
+
.gap-small {
|
|
59
|
+
gap: var(--space-2);
|
|
60
|
+
}
|
|
61
|
+
.gap-medium {
|
|
62
|
+
gap: var(--space-4);
|
|
63
|
+
}
|
|
64
|
+
.gap-large {
|
|
65
|
+
gap: var(--space-8);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* Align (main axis — justify-content) */
|
|
69
|
+
.align-start {
|
|
70
|
+
justify-content: flex-start;
|
|
71
|
+
}
|
|
72
|
+
.align-center {
|
|
73
|
+
justify-content: center;
|
|
74
|
+
}
|
|
75
|
+
.align-end {
|
|
76
|
+
justify-content: flex-end;
|
|
77
|
+
}
|
|
78
|
+
.align-space-between {
|
|
79
|
+
justify-content: space-between;
|
|
80
|
+
}
|
|
81
|
+
.align-space-around {
|
|
82
|
+
justify-content: space-around;
|
|
83
|
+
}
|
|
84
|
+
.align-space-evenly {
|
|
85
|
+
justify-content: space-evenly;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* Justify (cross axis — align-items) */
|
|
89
|
+
.justify-start {
|
|
90
|
+
align-items: flex-start;
|
|
91
|
+
}
|
|
92
|
+
.justify-center {
|
|
93
|
+
align-items: center;
|
|
94
|
+
}
|
|
95
|
+
.justify-end {
|
|
96
|
+
align-items: flex-end;
|
|
97
|
+
}
|
|
98
|
+
.justify-stretch {
|
|
99
|
+
align-items: stretch;
|
|
100
|
+
}
|
|
101
|
+
.justify-baseline {
|
|
102
|
+
align-items: baseline;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* Padding */
|
|
106
|
+
.padding-none {
|
|
107
|
+
padding: 0;
|
|
108
|
+
}
|
|
109
|
+
.padding-small {
|
|
110
|
+
padding: var(--space-2);
|
|
111
|
+
}
|
|
112
|
+
.padding-medium {
|
|
113
|
+
padding: var(--space-4);
|
|
114
|
+
}
|
|
115
|
+
.padding-large {
|
|
116
|
+
padding: var(--space-8);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/* Fill (flex: 1 to expand within a flex/grid parent) */
|
|
120
|
+
.fill {
|
|
121
|
+
flex: 1;
|
|
122
|
+
min-height: 0;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/* Wrap */
|
|
126
|
+
.wrap {
|
|
127
|
+
flex-wrap: wrap;
|
|
128
|
+
}
|
|
129
|
+
</style>
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@paired-component apps/dashboard/src/shared/ui/overlays/tooltip.tsx
|
|
3
|
+
@design-parity Props, variants, sizes, and visual output must stay in sync
|
|
4
|
+
with the Dashboard React counterpart. When modifying this component, replicate
|
|
5
|
+
the change in the paired React component to maintain visual and behavioral parity.
|
|
6
|
+
-->
|
|
7
|
+
<script lang="ts">
|
|
8
|
+
import type { Snippet } from 'svelte'
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
children: Snippet
|
|
12
|
+
content: string
|
|
13
|
+
placement?: 'top' | 'bottom' | 'left' | 'right'
|
|
14
|
+
isDisabled?: boolean
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let { children, content, placement = 'top', isDisabled = false }: Props = $props()
|
|
18
|
+
|
|
19
|
+
const tooltipId = `tooltip-${Math.random().toString(36).slice(2, 9)}`
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
{#if isDisabled}
|
|
23
|
+
{@render children()}
|
|
24
|
+
{:else}
|
|
25
|
+
<span class="tooltip-wrapper" aria-describedby={tooltipId}>
|
|
26
|
+
{@render children()}
|
|
27
|
+
<span
|
|
28
|
+
id={tooltipId}
|
|
29
|
+
class="tooltip placement-{placement}"
|
|
30
|
+
role="tooltip"
|
|
31
|
+
>
|
|
32
|
+
{content}
|
|
33
|
+
</span>
|
|
34
|
+
</span>
|
|
35
|
+
{/if}
|
|
36
|
+
|
|
37
|
+
<style>
|
|
38
|
+
.tooltip-wrapper {
|
|
39
|
+
position: relative;
|
|
40
|
+
display: inline-flex;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.tooltip {
|
|
44
|
+
pointer-events: none;
|
|
45
|
+
position: absolute;
|
|
46
|
+
z-index: 50;
|
|
47
|
+
white-space: nowrap;
|
|
48
|
+
border-radius: var(--radius-md);
|
|
49
|
+
background-color: var(--color-gray-900);
|
|
50
|
+
padding: var(--space-1-5) var(--space-2-5);
|
|
51
|
+
font-size: var(--text-sm);
|
|
52
|
+
color: var(--color-white);
|
|
53
|
+
box-shadow: var(--shadow-lg);
|
|
54
|
+
opacity: 0;
|
|
55
|
+
transition: opacity 0.15s ease;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.tooltip-wrapper:hover .tooltip,
|
|
59
|
+
.tooltip-wrapper:focus-within .tooltip {
|
|
60
|
+
opacity: 1;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.placement-top {
|
|
64
|
+
bottom: 100%;
|
|
65
|
+
left: 50%;
|
|
66
|
+
transform: translateX(-50%);
|
|
67
|
+
margin-bottom: var(--space-2);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.placement-bottom {
|
|
71
|
+
top: 100%;
|
|
72
|
+
left: 50%;
|
|
73
|
+
transform: translateX(-50%);
|
|
74
|
+
margin-top: var(--space-2);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.placement-left {
|
|
78
|
+
right: 100%;
|
|
79
|
+
top: 50%;
|
|
80
|
+
transform: translateY(-50%);
|
|
81
|
+
margin-right: var(--space-2);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.placement-right {
|
|
85
|
+
left: 100%;
|
|
86
|
+
top: 50%;
|
|
87
|
+
transform: translateY(-50%);
|
|
88
|
+
margin-left: var(--space-2);
|
|
89
|
+
}
|
|
90
|
+
</style>
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
.devtools {
|
|
2
|
+
/* Colors — match Tailwind's default palette exactly */
|
|
3
|
+
--color-blue-500: #3b82f6;
|
|
4
|
+
--color-blue-600: #2563eb;
|
|
5
|
+
--color-blue-700: #1d4ed8;
|
|
6
|
+
--color-blue-800: #1e40af;
|
|
7
|
+
--color-gray-50: #f9fafb;
|
|
8
|
+
--color-gray-100: #f3f4f6;
|
|
9
|
+
--color-gray-200: #e5e7eb;
|
|
10
|
+
--color-gray-300: #d1d5db;
|
|
11
|
+
--color-gray-500: #6b7280;
|
|
12
|
+
--color-gray-600: #4b5563;
|
|
13
|
+
--color-gray-700: #374151;
|
|
14
|
+
--color-gray-900: #111827;
|
|
15
|
+
--color-red-500: #ef4444;
|
|
16
|
+
--color-red-600: #dc2626;
|
|
17
|
+
--color-red-700: #b91c1c;
|
|
18
|
+
--color-red-800: #991b1b;
|
|
19
|
+
--color-green-100: #dcfce7;
|
|
20
|
+
--color-green-700: #15803d;
|
|
21
|
+
--color-green-800: #166534;
|
|
22
|
+
--color-yellow-100: #fef9c3;
|
|
23
|
+
--color-yellow-700: #a16207;
|
|
24
|
+
--color-yellow-800: #854d0e;
|
|
25
|
+
--color-white: #ffffff;
|
|
26
|
+
--color-black: #000000;
|
|
27
|
+
|
|
28
|
+
/* Typography — match Tailwind's type scale */
|
|
29
|
+
--text-xs: 0.75rem;
|
|
30
|
+
--text-sm: 0.875rem;
|
|
31
|
+
--text-base: 1rem;
|
|
32
|
+
--text-lg: 1.125rem;
|
|
33
|
+
--text-xl: 1.25rem;
|
|
34
|
+
--text-2xl: 1.5rem;
|
|
35
|
+
--font-normal: 400;
|
|
36
|
+
--font-medium: 500;
|
|
37
|
+
--font-semibold: 600;
|
|
38
|
+
|
|
39
|
+
/* Spacing — match Tailwind's spacing scale */
|
|
40
|
+
--space-0: 0;
|
|
41
|
+
--space-0-5: 0.125rem;
|
|
42
|
+
--space-1: 0.25rem;
|
|
43
|
+
--space-1-5: 0.375rem;
|
|
44
|
+
--space-2: 0.5rem;
|
|
45
|
+
--space-2-5: 0.625rem;
|
|
46
|
+
--space-3: 0.75rem;
|
|
47
|
+
--space-4: 1rem;
|
|
48
|
+
--space-5: 1.25rem;
|
|
49
|
+
--space-6: 1.5rem;
|
|
50
|
+
--space-8: 2rem;
|
|
51
|
+
|
|
52
|
+
/* Radii */
|
|
53
|
+
--radius-sm: 0.125rem;
|
|
54
|
+
--radius-md: 0.375rem;
|
|
55
|
+
--radius-lg: 0.5rem;
|
|
56
|
+
--radius-xl: 0.75rem;
|
|
57
|
+
--radius-full: 9999px;
|
|
58
|
+
|
|
59
|
+
/* Shadows */
|
|
60
|
+
--shadow-card: 0 1px 2px 0 rgba(0, 0, 0, 0.03);
|
|
61
|
+
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
|
|
62
|
+
--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
|
|
63
|
+
|
|
64
|
+
/* Focus ring — matches dashboard's ring-2 ring-blue-500 ring-offset-2 */
|
|
65
|
+
--ring-color: var(--color-blue-500);
|
|
66
|
+
--ring-width: 2px;
|
|
67
|
+
--ring-offset: 2px;
|
|
68
|
+
|
|
69
|
+
/* Base typography reset */
|
|
70
|
+
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
|
|
71
|
+
'Helvetica Neue', Arial, sans-serif;
|
|
72
|
+
font-size: var(--text-sm);
|
|
73
|
+
line-height: 1.5;
|
|
74
|
+
color: var(--color-gray-900);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Compact inline form elements for use within table cells */
|
|
78
|
+
.devtools .inline-select,
|
|
79
|
+
.devtools .inline-input {
|
|
80
|
+
font-size: var(--text-xs);
|
|
81
|
+
padding: var(--space-0-5) var(--space-1);
|
|
82
|
+
border: 1px solid var(--color-gray-300);
|
|
83
|
+
border-radius: var(--radius-sm);
|
|
84
|
+
font-family: inherit;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.devtools .inline-input {
|
|
88
|
+
width: 100%;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.devtools .inline-select:focus,
|
|
92
|
+
.devtools .inline-input:focus {
|
|
93
|
+
outline: none;
|
|
94
|
+
box-shadow: 0 0 0 var(--ring-width) var(--ring-color);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** Textarea elements within devtools */
|
|
98
|
+
.devtools textarea {
|
|
99
|
+
width: 100%;
|
|
100
|
+
min-height: 60px;
|
|
101
|
+
font-family: monospace;
|
|
102
|
+
font-size: var(--text-xs);
|
|
103
|
+
padding: var(--space-1);
|
|
104
|
+
border: 1px solid var(--color-gray-300);
|
|
105
|
+
border-radius: var(--radius-md);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.devtools textarea:focus {
|
|
109
|
+
outline: none;
|
|
110
|
+
box-shadow: 0 0 0 var(--ring-width) var(--ring-color);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Event detail panel styling */
|
|
114
|
+
.devtools .details-cell {
|
|
115
|
+
background-color: var(--color-gray-50);
|
|
116
|
+
padding: var(--space-4);
|
|
117
|
+
border-left: 3px solid var(--color-blue-500);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Expand/collapse icon for table rows */
|
|
121
|
+
.devtools .expand-icon {
|
|
122
|
+
margin-right: var(--space-2);
|
|
123
|
+
display: inline-block;
|
|
124
|
+
width: 12px;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** Clickable table rows (e.g., expandable event rows) */
|
|
128
|
+
.devtools .event-row {
|
|
129
|
+
cursor: pointer;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Centered checkbox cell in tables */
|
|
133
|
+
.devtools .include-cell {
|
|
134
|
+
text-align: center;
|
|
135
|
+
width: 2.5rem;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Inline option label for checkbox/radio lists in table cells */
|
|
139
|
+
.devtools .option-label {
|
|
140
|
+
display: flex;
|
|
141
|
+
align-items: center;
|
|
142
|
+
gap: var(--space-2);
|
|
143
|
+
cursor: pointer;
|
|
144
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=".devtools{--color-blue-500: #3b82f6;--color-blue-600: #2563eb;--color-blue-700: #1d4ed8;--color-blue-800: #1e40af;--color-gray-50: #f9fafb;--color-gray-100: #f3f4f6;--color-gray-200: #e5e7eb;--color-gray-300: #d1d5db;--color-gray-500: #6b7280;--color-gray-600: #4b5563;--color-gray-700: #374151;--color-gray-900: #111827;--color-red-500: #ef4444;--color-red-600: #dc2626;--color-red-700: #b91c1c;--color-red-800: #991b1b;--color-green-100: #dcfce7;--color-green-700: #15803d;--color-green-800: #166534;--color-yellow-100: #fef9c3;--color-yellow-700: #a16207;--color-yellow-800: #854d0e;--color-white: #ffffff;--color-black: #000000;--text-xs: .75rem;--text-sm: .875rem;--text-base: 1rem;--text-lg: 1.125rem;--text-xl: 1.25rem;--text-2xl: 1.5rem;--font-normal: 400;--font-medium: 500;--font-semibold: 600;--space-0: 0;--space-0-5: .125rem;--space-1: .25rem;--space-1-5: .375rem;--space-2: .5rem;--space-2-5: .625rem;--space-3: .75rem;--space-4: 1rem;--space-5: 1.25rem;--space-6: 1.5rem;--space-8: 2rem;--radius-sm: .125rem;--radius-md: .375rem;--radius-lg: .5rem;--radius-xl: .75rem;--radius-full: 9999px;--shadow-card: 0 1px 2px 0 rgba(0, 0, 0, .03);--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, .1), 0 4px 6px -4px rgba(0, 0, 0, .1);--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, .1), 0 8px 10px -6px rgba(0, 0, 0, .1);--ring-color: var(--color-blue-500);--ring-width: 2px;--ring-offset: 2px;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:var(--text-sm);line-height:1.5;color:var(--color-gray-900)}.devtools .inline-select,.devtools .inline-input{font-size:var(--text-xs);padding:var(--space-0-5) var(--space-1);border:1px solid var(--color-gray-300);border-radius:var(--radius-sm);font-family:inherit}.devtools .inline-input{width:100%}.devtools .inline-select:focus,.devtools .inline-input:focus{outline:none;box-shadow:0 0 0 var(--ring-width) var(--ring-color)}.devtools textarea{width:100%;min-height:60px;font-family:monospace;font-size:var(--text-xs);padding:var(--space-1);border:1px solid var(--color-gray-300);border-radius:var(--radius-md)}.devtools textarea:focus{outline:none;box-shadow:0 0 0 var(--ring-width) var(--ring-color)}.devtools .details-cell{background-color:var(--color-gray-50);padding:var(--space-4);border-left:3px solid var(--color-blue-500)}.devtools .expand-icon{margin-right:var(--space-2);display:inline-block;width:12px}.devtools .event-row{cursor:pointer}.devtools .include-cell{text-align:center;width:2.5rem}.devtools .option-label{display:flex;align-items:center;gap:var(--space-2);cursor:pointer}";export{e as default};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@paired-component apps/dashboard/src/shared/ui/typography/heading.tsx
|
|
3
|
+
@design-parity Props, variants, sizes, and visual output must stay in sync
|
|
4
|
+
with the Dashboard React counterpart. When modifying this component, replicate
|
|
5
|
+
the change in the paired React component to maintain visual and behavioral parity.
|
|
6
|
+
-->
|
|
7
|
+
<script lang="ts">
|
|
8
|
+
import type { Snippet } from 'svelte'
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
children: Snippet
|
|
12
|
+
level?: 1 | 2 | 3 | 4 | 5 | 6
|
|
13
|
+
size?: 'large' | 'medium' | 'small'
|
|
14
|
+
align?: 'start' | 'center' | 'end'
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let { children, level = 2, size = 'medium', align = 'start' }: Props = $props()
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
<svelte:element
|
|
21
|
+
this={`h${level}`}
|
|
22
|
+
class="heading size-{size} align-{align}"
|
|
23
|
+
>
|
|
24
|
+
{@render children()}
|
|
25
|
+
</svelte:element>
|
|
26
|
+
|
|
27
|
+
<style>
|
|
28
|
+
.heading {
|
|
29
|
+
color: var(--color-gray-900);
|
|
30
|
+
margin: 0;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.size-large {
|
|
34
|
+
font-size: var(--text-2xl);
|
|
35
|
+
font-weight: var(--font-semibold);
|
|
36
|
+
}
|
|
37
|
+
.size-medium {
|
|
38
|
+
font-size: var(--text-xl);
|
|
39
|
+
font-weight: var(--font-semibold);
|
|
40
|
+
}
|
|
41
|
+
.size-small {
|
|
42
|
+
font-size: var(--text-lg);
|
|
43
|
+
font-weight: var(--font-medium);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.align-start {
|
|
47
|
+
text-align: start;
|
|
48
|
+
}
|
|
49
|
+
.align-center {
|
|
50
|
+
text-align: center;
|
|
51
|
+
}
|
|
52
|
+
.align-end {
|
|
53
|
+
text-align: end;
|
|
54
|
+
}
|
|
55
|
+
</style>
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@paired-component apps/dashboard/src/shared/ui/typography/text.tsx
|
|
3
|
+
@design-parity Props, variants, sizes, and visual output must stay in sync
|
|
4
|
+
with the Dashboard React counterpart. When modifying this component, replicate
|
|
5
|
+
the change in the paired React component to maintain visual and behavioral parity.
|
|
6
|
+
-->
|
|
7
|
+
<script lang="ts">
|
|
8
|
+
import type { Snippet } from 'svelte'
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
children: Snippet
|
|
12
|
+
size?: 'large' | 'medium' | 'small' | 'caption'
|
|
13
|
+
color?: 'default' | 'subdued' | 'success' | 'warning' | 'error'
|
|
14
|
+
weight?: 'regular' | 'medium' | 'semibold'
|
|
15
|
+
align?: 'start' | 'center' | 'end'
|
|
16
|
+
inline?: boolean
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let {
|
|
20
|
+
children,
|
|
21
|
+
size = 'medium',
|
|
22
|
+
color = 'default',
|
|
23
|
+
weight = 'regular',
|
|
24
|
+
align = 'start',
|
|
25
|
+
inline = false,
|
|
26
|
+
}: Props = $props()
|
|
27
|
+
</script>
|
|
28
|
+
|
|
29
|
+
<svelte:element
|
|
30
|
+
this={inline ? 'span' : 'p'}
|
|
31
|
+
class="text size-{size} color-{color} weight-{weight} align-{align}"
|
|
32
|
+
>
|
|
33
|
+
{@render children()}
|
|
34
|
+
</svelte:element>
|
|
35
|
+
|
|
36
|
+
<style>
|
|
37
|
+
.text {
|
|
38
|
+
margin: 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* Sizes */
|
|
42
|
+
.size-large {
|
|
43
|
+
font-size: var(--text-base);
|
|
44
|
+
}
|
|
45
|
+
.size-medium {
|
|
46
|
+
font-size: var(--text-sm);
|
|
47
|
+
}
|
|
48
|
+
.size-small {
|
|
49
|
+
font-size: var(--text-xs);
|
|
50
|
+
}
|
|
51
|
+
.size-caption {
|
|
52
|
+
font-size: var(--text-xs);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* Colors */
|
|
56
|
+
.color-default {
|
|
57
|
+
color: var(--color-gray-900);
|
|
58
|
+
}
|
|
59
|
+
.color-subdued {
|
|
60
|
+
color: var(--color-gray-600);
|
|
61
|
+
}
|
|
62
|
+
.color-success {
|
|
63
|
+
color: var(--color-green-700);
|
|
64
|
+
}
|
|
65
|
+
.color-warning {
|
|
66
|
+
color: var(--color-yellow-700);
|
|
67
|
+
}
|
|
68
|
+
.color-error {
|
|
69
|
+
color: var(--color-red-600);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* Weights */
|
|
73
|
+
.weight-regular {
|
|
74
|
+
font-weight: var(--font-normal);
|
|
75
|
+
}
|
|
76
|
+
.weight-medium {
|
|
77
|
+
font-weight: var(--font-medium);
|
|
78
|
+
}
|
|
79
|
+
.weight-semibold {
|
|
80
|
+
font-weight: var(--font-semibold);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* Alignment */
|
|
84
|
+
.align-start {
|
|
85
|
+
text-align: start;
|
|
86
|
+
}
|
|
87
|
+
.align-center {
|
|
88
|
+
text-align: center;
|
|
89
|
+
}
|
|
90
|
+
.align-end {
|
|
91
|
+
text-align: end;
|
|
92
|
+
}
|
|
93
|
+
</style>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@picked/svelte",
|
|
3
|
-
"version": "0.0.45-next.
|
|
3
|
+
"version": "0.0.45-next.3",
|
|
4
4
|
"dependencies": {
|
|
5
5
|
"d3": "^7.9.0"
|
|
6
6
|
},
|
|
@@ -79,11 +79,14 @@
|
|
|
79
79
|
"jscpd",
|
|
80
80
|
"eslint",
|
|
81
81
|
"tsc"
|
|
82
|
+
],
|
|
83
|
+
"entry": [
|
|
84
|
+
"src/plugins/devtools/ui/index.ts"
|
|
82
85
|
]
|
|
83
86
|
},
|
|
84
87
|
"module": "./dist/index.js",
|
|
85
88
|
"peerDependencies": {
|
|
86
|
-
"@picked/client": "0.0.45-next.
|
|
89
|
+
"@picked/client": "0.0.45-next.3",
|
|
87
90
|
"effector": "^23.3.0",
|
|
88
91
|
"svelte": "^5.34.3"
|
|
89
92
|
},
|