lutra 0.1.69 → 0.1.73

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 (40) hide show
  1. package/dist/components/Callout.svelte +85 -0
  2. package/dist/components/Callout.svelte.d.ts +14 -0
  3. package/dist/components/DataList.svelte +111 -0
  4. package/dist/components/DataList.svelte.d.ts +10 -0
  5. package/dist/components/DataListTypes.d.ts +14 -0
  6. package/dist/components/DataListTypes.js +1 -0
  7. package/dist/components/IconButton.svelte +12 -4
  8. package/dist/components/IconButton.svelte.d.ts +2 -0
  9. package/dist/components/Layout.svelte +1 -1
  10. package/dist/components/Popover.svelte +4 -1
  11. package/dist/components/Tabs.svelte +13 -1
  12. package/dist/components/Tabs.svelte.d.ts +2 -0
  13. package/dist/components/Tag.svelte +11 -3
  14. package/dist/components/Tag.svelte.d.ts +2 -0
  15. package/dist/components/index.d.ts +3 -0
  16. package/dist/components/index.js +3 -0
  17. package/dist/css/1-props.css +157 -136
  18. package/dist/css/2-init.css +39 -23
  19. package/dist/css/themes/DefaultTheme.css +10 -0
  20. package/dist/form/Button.svelte +4 -4
  21. package/dist/form/Button.svelte.d.ts +1 -1
  22. package/dist/form/FieldContent.svelte +11 -3
  23. package/dist/form/FieldContent.svelte.d.ts +2 -0
  24. package/dist/form/FieldGroup.svelte +84 -0
  25. package/dist/form/FieldGroup.svelte.d.ts +20 -0
  26. package/dist/form/Input.svelte +4 -0
  27. package/dist/form/Input.svelte.d.ts +2 -0
  28. package/dist/form/SegmentedControl.svelte +273 -0
  29. package/dist/form/SegmentedControl.svelte.d.ts +33 -0
  30. package/dist/form/SegmentedControlTypes.d.ts +8 -0
  31. package/dist/form/SegmentedControlTypes.js +1 -0
  32. package/dist/form/Select.svelte +4 -0
  33. package/dist/form/Select.svelte.d.ts +2 -0
  34. package/dist/form/Textarea.svelte +4 -0
  35. package/dist/form/Textarea.svelte.d.ts +2 -0
  36. package/dist/form/Toggle.svelte +166 -0
  37. package/dist/form/Toggle.svelte.d.ts +33 -17
  38. package/dist/form/index.d.ts +3 -0
  39. package/dist/form/index.js +3 -0
  40. package/package.json +1 -1
@@ -1,4 +1,170 @@
1
1
  <script lang="ts">
2
+ import { getContext, onMount, type Snippet } from "svelte";
3
+ import type { LutraForm } from "./types.js";
4
+ import { fieldChange } from "./client.svelte.js";
5
+ import FieldContent from "./FieldContent.svelte";
6
+ import { getFromObjWithStringPath } from "./form.js";
7
+ import { ZodType } from "zod";
2
8
 
9
+ /**
10
+ * @description
11
+ * A mobile-style toggle switch. Renders as `<input type="checkbox" role="switch">`
12
+ * for full accessibility. Integrates with the Lutra form system for validation,
13
+ * error display and field state tracking.
14
+ *
15
+ * @example
16
+ * <Toggle name="notifications" label="Enable notifications" />
17
+ * <Toggle name="darkMode" label="Dark mode" value={true} />
18
+ */
19
+ let {
20
+ disabled,
21
+ help,
22
+ id = $bindable(crypto.randomUUID()),
23
+ label,
24
+ labelHelp,
25
+ labelTip,
26
+ name,
27
+ onblur,
28
+ onchange,
29
+ onfocus,
30
+ required,
31
+ scale = 'md',
32
+ title,
33
+ value = $bindable(false),
34
+ ...rest
35
+ }: {
36
+ /** Whether the toggle is disabled. */
37
+ disabled?: boolean;
38
+ /** Help text to display below the toggle. */
39
+ help?: string | Snippet;
40
+ /** A random id is generated if not provided. */
41
+ id?: string;
42
+ /** The label for the toggle. */
43
+ label?: string | Snippet;
44
+ /** Help text to display below the label. */
45
+ labelHelp?: string | Snippet;
46
+ /** Context tooltip for the label. Renders with a questionmark using ContextTip. */
47
+ labelTip?: string | Snippet;
48
+ /** The name of the toggle field. */
49
+ name: string;
50
+ /** The onblur event handler. */
51
+ onblur?: (e: FocusEvent) => void;
52
+ /** Onchange event handler. */
53
+ onchange?: (e: Event) => void;
54
+ /** Onfocus event handler. */
55
+ onfocus?: (e: FocusEvent) => void;
56
+ /** Whether the toggle is required. */
57
+ required?: boolean;
58
+ /** Size variant controlling font-size. Em-based tokens cascade automatically. */
59
+ scale?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
60
+ /** A string that defines the title of the toggle. */
61
+ title?: string;
62
+ /** The checked state of the toggle. */
63
+ value?: boolean;
64
+ } = $props();
65
+
66
+ let el: HTMLInputElement | undefined = $state();
67
+
68
+ const form = getContext<LutraForm<any>>('form');
69
+ const field = $derived(form?.fields[name]);
70
+ const issue = $derived(form?.issues?.find((issue) => issue.name === name));
71
+ const validator = getContext<Record<string, ZodType>>('form.validators')?.[name];
72
+ const data = form?.data;
73
+ const originalData = form?.originalData;
74
+
75
+ if(!value) value = form ? (getFromObjWithStringPath(Object.assign(originalData ?? {}, data ?? {}), name) as boolean) : false;
76
+
77
+ onMount(() => {
78
+ if(value) fieldChange(form, name, () => el)({} as any);
79
+ });
3
80
  </script>
4
81
 
82
+ <FieldContent
83
+ {id}
84
+ {label}
85
+ {labelHelp}
86
+ {labelTip}
87
+ contained={false}
88
+ direction="row"
89
+ {field}
90
+ {issue}
91
+ type="toggle"
92
+ {help}
93
+ {required}
94
+ {scale}
95
+ >
96
+ <input
97
+ type="checkbox"
98
+ role="switch"
99
+ class="Toggle"
100
+ bind:this={el}
101
+ {disabled}
102
+ {id}
103
+ {name}
104
+ {title}
105
+ required={required || field?.required}
106
+ onchange={fieldChange(form, name, () => el, validator, onchange)}
107
+ {onblur}
108
+ {onfocus}
109
+ bind:checked={value}
110
+ aria-checked={value}
111
+ {...rest}
112
+ />
113
+ </FieldContent>
114
+
115
+ <style>
116
+ input.Toggle {
117
+ appearance: none;
118
+ width: var(--toggle-width);
119
+ height: var(--toggle-height);
120
+ border-radius: calc(infinity * 1px);
121
+ background: var(--toggle-background);
122
+ border: var(--field-border-size) var(--field-border-style) var(--toggle-border-color);
123
+ cursor: pointer;
124
+ position: relative;
125
+ flex-shrink: 0;
126
+ padding: 0;
127
+ margin: 0;
128
+ transition:
129
+ background var(--transition-duration-fast) var(--transition-timing-function),
130
+ border-color var(--transition-duration-fast) var(--transition-timing-function);
131
+ }
132
+
133
+ input.Toggle::before {
134
+ content: "";
135
+ position: absolute;
136
+ top: 50%;
137
+ inset-inline-start: var(--toggle-thumb-offset);
138
+ width: var(--toggle-thumb-size);
139
+ height: var(--toggle-thumb-size);
140
+ border-radius: 50%;
141
+ background: var(--toggle-thumb-color);
142
+ translate: 0 -50%;
143
+ transition: translate var(--transition-duration-fast) var(--transition-timing-function);
144
+ box-shadow: var(--toggle-thumb-shadow);
145
+ }
146
+
147
+ input.Toggle:checked {
148
+ background: var(--toggle-background-checked);
149
+ border-color: var(--toggle-border-color-checked);
150
+ }
151
+
152
+ input.Toggle:checked::before {
153
+ translate: calc(var(--toggle-width) - var(--toggle-height)) -50%;
154
+ }
155
+
156
+ input.Toggle:checked::after {
157
+ content: none;
158
+ display: none;
159
+ }
160
+
161
+ input.Toggle:focus-visible {
162
+ outline: var(--focus-ring-size) solid var(--focus-ring-color);
163
+ outline-offset: var(--focus-ring-offset);
164
+ }
165
+
166
+ input.Toggle:disabled {
167
+ opacity: 0.5;
168
+ cursor: not-allowed;
169
+ }
170
+ </style>
@@ -1,18 +1,34 @@
1
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
- $$bindings?: Bindings;
4
- } & Exports;
5
- (internal: unknown, props: {
6
- $$events?: Events;
7
- $$slots?: Slots;
8
- }): Exports & {
9
- $set?: any;
10
- $on?: any;
11
- };
12
- z_$$bindings?: Bindings;
13
- }
14
- declare const Toggle: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
- [evt: string]: CustomEvent<any>;
16
- }, {}, {}, string>;
17
- type Toggle = InstanceType<typeof Toggle>;
1
+ import { type Snippet } from "svelte";
2
+ type $$ComponentProps = {
3
+ /** Whether the toggle is disabled. */
4
+ disabled?: boolean;
5
+ /** Help text to display below the toggle. */
6
+ help?: string | Snippet;
7
+ /** A random id is generated if not provided. */
8
+ id?: string;
9
+ /** The label for the toggle. */
10
+ label?: string | Snippet;
11
+ /** Help text to display below the label. */
12
+ labelHelp?: string | Snippet;
13
+ /** Context tooltip for the label. Renders with a questionmark using ContextTip. */
14
+ labelTip?: string | Snippet;
15
+ /** The name of the toggle field. */
16
+ name: string;
17
+ /** The onblur event handler. */
18
+ onblur?: (e: FocusEvent) => void;
19
+ /** Onchange event handler. */
20
+ onchange?: (e: Event) => void;
21
+ /** Onfocus event handler. */
22
+ onfocus?: (e: FocusEvent) => void;
23
+ /** Whether the toggle is required. */
24
+ required?: boolean;
25
+ /** Size variant controlling font-size. Em-based tokens cascade automatically. */
26
+ scale?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
27
+ /** A string that defines the title of the toggle. */
28
+ title?: string;
29
+ /** The checked state of the toggle. */
30
+ value?: boolean;
31
+ };
32
+ declare const Toggle: import("svelte").Component<$$ComponentProps, {}, "id" | "value">;
33
+ type Toggle = ReturnType<typeof Toggle>;
18
34
  export default Toggle;
@@ -1,6 +1,7 @@
1
1
  export { default as Button } from './Button.svelte';
2
2
  export { default as FormActions } from './FormActions.svelte';
3
3
  export { default as FieldError } from './FieldError.svelte';
4
+ export { default as FieldGroup } from './FieldGroup.svelte';
4
5
  export { default as FormSection } from './FormSection.svelte';
5
6
  export { default as Fieldset } from './Fieldset.svelte';
6
7
  export { default as Form } from './Form.svelte';
@@ -9,9 +10,11 @@ export { default as Input } from './Input.svelte';
9
10
  export { default as InputLength } from './InputLength.svelte';
10
11
  export { default as Label } from './Label.svelte';
11
12
  export { default as LogoUpload } from './LogoUpload.svelte';
13
+ export { default as SegmentedControl } from './SegmentedControl.svelte';
12
14
  export { default as Select } from './Select.svelte';
13
15
  export { default as Textarea } from './Textarea.svelte';
14
16
  export { default as Toggle } from './Toggle.svelte';
17
+ export * from './SegmentedControlTypes.js';
15
18
  export * from './types.js';
16
19
  export * from './form.js';
17
20
  export * from './client.svelte.js';
@@ -1,6 +1,7 @@
1
1
  export { default as Button } from './Button.svelte';
2
2
  export { default as FormActions } from './FormActions.svelte';
3
3
  export { default as FieldError } from './FieldError.svelte';
4
+ export { default as FieldGroup } from './FieldGroup.svelte';
4
5
  export { default as FormSection } from './FormSection.svelte';
5
6
  export { default as Fieldset } from './Fieldset.svelte';
6
7
  export { default as Form } from './Form.svelte';
@@ -9,9 +10,11 @@ export { default as Input } from './Input.svelte';
9
10
  export { default as InputLength } from './InputLength.svelte';
10
11
  export { default as Label } from './Label.svelte';
11
12
  export { default as LogoUpload } from './LogoUpload.svelte';
13
+ export { default as SegmentedControl } from './SegmentedControl.svelte';
12
14
  export { default as Select } from './Select.svelte';
13
15
  export { default as Textarea } from './Textarea.svelte';
14
16
  export { default as Toggle } from './Toggle.svelte';
17
+ export * from './SegmentedControlTypes.js';
15
18
  export * from './types.js';
16
19
  export * from './form.js';
17
20
  export * from './client.svelte.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lutra",
3
- "version": "0.1.69",
3
+ "version": "0.1.73",
4
4
  "scripts": {
5
5
  "dev": "vite dev",
6
6
  "bump-and-publish:patch": "pnpm version:patch && pnpm build && npm publish",