@fivem-nui/svelte-components 0.0.0-stage → 1.0.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.
- package/README.md +101 -2
- package/dist/components/actions/NuiButton.svelte +292 -0
- package/dist/components/actions/NuiButton.svelte.d.ts +60 -0
- package/dist/components/data/NuiBadge.svelte +277 -0
- package/dist/components/data/NuiBadge.svelte.d.ts +74 -0
- package/dist/components/data/NuiCodeBlock.svelte +256 -0
- package/dist/components/data/NuiCodeBlock.svelte.d.ts +49 -0
- package/dist/components/data/NuiList.svelte +341 -0
- package/dist/components/data/NuiList.svelte.d.ts +52 -0
- package/dist/components/data/NuiProgressBar.svelte +264 -0
- package/dist/components/data/NuiProgressBar.svelte.d.ts +51 -0
- package/dist/components/data/NuiRichText.svelte +260 -0
- package/dist/components/data/NuiRichText.svelte.d.ts +33 -0
- package/dist/components/data/NuiTable.svelte +470 -0
- package/dist/components/data/NuiTable.svelte.d.ts +53 -0
- package/dist/components/data/chart/NuiChart.svelte +384 -0
- package/dist/components/data/chart/NuiChart.svelte.d.ts +49 -0
- package/dist/components/data/chart/color.d.ts +9 -0
- package/dist/components/data/chart/color.js +78 -0
- package/dist/components/data/chart/index.d.ts +10 -0
- package/dist/components/data/chart/index.js +10 -0
- package/dist/components/data/chart/registry.d.ts +14 -0
- package/dist/components/data/chart/registry.js +53 -0
- package/dist/components/data/chart/renderers/bar.d.ts +8 -0
- package/dist/components/data/chart/renderers/bar.js +79 -0
- package/dist/components/data/chart/renderers/base.d.ts +18 -0
- package/dist/components/data/chart/renderers/base.js +10 -0
- package/dist/components/data/chart/renderers/line.d.ts +8 -0
- package/dist/components/data/chart/renderers/line.js +89 -0
- package/dist/components/data/chart/renderers/pie.d.ts +10 -0
- package/dist/components/data/chart/renderers/pie.js +55 -0
- package/dist/components/data/chart/scale.d.ts +22 -0
- package/dist/components/data/chart/scale.js +101 -0
- package/dist/components/data/chart/types.d.ts +84 -0
- package/dist/components/data/chart/types.js +1 -0
- package/dist/components/data/chart/validator.d.ts +10 -0
- package/dist/components/data/chart/validator.js +82 -0
- package/dist/components/forms/NuiCheckbox.svelte +218 -0
- package/dist/components/forms/NuiCheckbox.svelte.d.ts +37 -0
- package/dist/components/forms/NuiDatepicker.svelte +755 -0
- package/dist/components/forms/NuiDatepicker.svelte.d.ts +34 -0
- package/dist/components/forms/NuiFileInput.svelte +1047 -0
- package/dist/components/forms/NuiFileInput.svelte.d.ts +93 -0
- package/dist/components/forms/NuiFileInput.types.d.ts +28 -0
- package/dist/components/forms/NuiFileInput.types.js +1 -0
- package/dist/components/forms/NuiForm.svelte +391 -0
- package/dist/components/forms/NuiForm.svelte.d.ts +69 -0
- package/dist/components/forms/NuiInput.svelte +296 -0
- package/dist/components/forms/NuiInput.svelte.d.ts +62 -0
- package/dist/components/forms/NuiRadioGroup.svelte +238 -0
- package/dist/components/forms/NuiRadioGroup.svelte.d.ts +47 -0
- package/dist/components/forms/NuiSelect.svelte +819 -0
- package/dist/components/forms/NuiSelect.svelte.d.ts +49 -0
- package/dist/components/layout/NuiCard.svelte +314 -0
- package/dist/components/layout/NuiCard.svelte.d.ts +48 -0
- package/dist/components/layout/NuiCardGrid.svelte +98 -0
- package/dist/components/layout/NuiCardGrid.svelte.d.ts +22 -0
- package/dist/components/layout/NuiFlex.svelte +121 -0
- package/dist/components/layout/NuiFlex.svelte.d.ts +23 -0
- package/dist/components/layout/NuiGrid.svelte +66 -0
- package/dist/components/layout/NuiGrid.svelte.d.ts +14 -0
- package/dist/components/layout/NuiStack.svelte +138 -0
- package/dist/components/layout/NuiStack.svelte.d.ts +26 -0
- package/dist/components/navigation/NuiAccordion.svelte +323 -0
- package/dist/components/navigation/NuiAccordion.svelte.d.ts +38 -0
- package/dist/components/navigation/NuiBreadcrumbs.svelte +133 -0
- package/dist/components/navigation/NuiBreadcrumbs.svelte.d.ts +19 -0
- package/dist/components/navigation/NuiMenu.svelte +596 -0
- package/dist/components/navigation/NuiMenu.svelte.d.ts +28 -0
- package/dist/components/navigation/NuiPagination.svelte +306 -0
- package/dist/components/navigation/NuiPagination.svelte.d.ts +40 -0
- package/dist/components/navigation/NuiSidebar.svelte +186 -0
- package/dist/components/navigation/NuiSidebar.svelte.d.ts +26 -0
- package/dist/components/navigation/NuiTabs.svelte +249 -0
- package/dist/components/navigation/NuiTabs.svelte.d.ts +31 -0
- package/dist/components/overlay/NuiDialog.svelte +118 -0
- package/dist/components/overlay/NuiDialog.svelte.d.ts +34 -0
- package/dist/components/overlay/NuiModal.svelte +992 -0
- package/dist/components/overlay/NuiModal.svelte.d.ts +72 -0
- package/dist/components/overlay/NuiTooltip.svelte +159 -0
- package/dist/components/overlay/NuiTooltip.svelte.d.ts +13 -0
- package/dist/composables/useClickOutside.d.ts +43 -0
- package/dist/composables/useClickOutside.js +73 -0
- package/dist/composables/useFormValidation.d.ts +23 -0
- package/dist/composables/useFormValidation.js +72 -0
- package/dist/composables/useIdle.svelte.d.ts +18 -0
- package/dist/composables/useIdle.svelte.js +144 -0
- package/dist/composables/useKeyboardShortcut.svelte.d.ts +114 -0
- package/dist/composables/useKeyboardShortcut.svelte.js +153 -0
- package/dist/composables/useLocalStorage.svelte.d.ts +22 -0
- package/dist/composables/useLocalStorage.svelte.js +105 -0
- package/dist/composables/useMediaQuery.svelte.d.ts +51 -0
- package/dist/composables/useMediaQuery.svelte.js +80 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.js +42 -0
- package/package.json +58 -3
- package/src/components/actions/NuiButton.svelte +292 -0
- package/src/components/data/NuiBadge.svelte +277 -0
- package/src/components/data/NuiCodeBlock.svelte +256 -0
- package/src/components/data/NuiList.svelte +341 -0
- package/src/components/data/NuiProgressBar.svelte +264 -0
- package/src/components/data/NuiRichText.svelte +260 -0
- package/src/components/data/NuiTable.svelte +470 -0
- package/src/components/data/chart/NuiChart.svelte +384 -0
- package/src/components/data/chart/color.ts +83 -0
- package/src/components/data/chart/index.ts +10 -0
- package/src/components/data/chart/registry.ts +71 -0
- package/src/components/data/chart/renderers/bar.ts +90 -0
- package/src/components/data/chart/renderers/base.ts +32 -0
- package/src/components/data/chart/renderers/line.ts +99 -0
- package/src/components/data/chart/renderers/pie.ts +66 -0
- package/src/components/data/chart/scale.ts +139 -0
- package/src/components/data/chart/types.ts +98 -0
- package/src/components/data/chart/validator.ts +98 -0
- package/src/components/forms/NuiCheckbox.svelte +218 -0
- package/src/components/forms/NuiDatepicker.svelte +755 -0
- package/src/components/forms/NuiFileInput.svelte +1047 -0
- package/src/components/forms/NuiFileInput.types.ts +29 -0
- package/src/components/forms/NuiForm.svelte +391 -0
- package/src/components/forms/NuiInput.svelte +296 -0
- package/src/components/forms/NuiRadioGroup.svelte +238 -0
- package/src/components/forms/NuiSelect.svelte +819 -0
- package/src/components/layout/NuiCard.svelte +314 -0
- package/src/components/layout/NuiCardGrid.svelte +98 -0
- package/src/components/layout/NuiFlex.svelte +121 -0
- package/src/components/layout/NuiGrid.svelte +66 -0
- package/src/components/layout/NuiStack.svelte +138 -0
- package/src/components/navigation/NuiAccordion.svelte +323 -0
- package/src/components/navigation/NuiBreadcrumbs.svelte +133 -0
- package/src/components/navigation/NuiMenu.svelte +596 -0
- package/src/components/navigation/NuiPagination.svelte +306 -0
- package/src/components/navigation/NuiSidebar.svelte +186 -0
- package/src/components/navigation/NuiTabs.svelte +249 -0
- package/src/components/overlay/NuiDialog.svelte +118 -0
- package/src/components/overlay/NuiModal.svelte +992 -0
- package/src/components/overlay/NuiTooltip.svelte +159 -0
- package/src/composables/useClickOutside.ts +132 -0
- package/src/composables/useFormValidation.ts +105 -0
- package/src/composables/useIdle.svelte.ts +191 -0
- package/src/composables/useKeyboardShortcut.svelte.ts +278 -0
- package/src/composables/useLocalStorage.svelte.ts +137 -0
- package/src/composables/useMediaQuery.svelte.ts +102 -0
- package/src/index.ts +66 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component NuiCheckbox
|
|
3
|
+
Accessible toggle checkbox component with FiveM NUI event synchronization,
|
|
4
|
+
intermediate state support, and keyboard accessibility.
|
|
5
|
+
-->
|
|
6
|
+
<script lang="ts">
|
|
7
|
+
import { nui } from '@fivem-nui/svelte';
|
|
8
|
+
import type { SvelteNuiClient } from '@fivem-nui/svelte';
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
/** Optional HTML id attribute. Defaults to a unique generated id via $props.id(). */
|
|
12
|
+
id?: string;
|
|
13
|
+
/** Current checked state. Supports two-way binding. */
|
|
14
|
+
value?: boolean;
|
|
15
|
+
/** Text label displayed next to checkbox. */
|
|
16
|
+
label?: string;
|
|
17
|
+
/** Secondary description text displayed below label. */
|
|
18
|
+
description?: string;
|
|
19
|
+
/** Accessible label for screen readers when visual label is omitted. */
|
|
20
|
+
ariaLabel?: string;
|
|
21
|
+
/** Whether checkbox is in an indeterminate state. Supports two-way binding. */
|
|
22
|
+
indeterminate?: boolean;
|
|
23
|
+
/** Whether checkbox is disabled. */
|
|
24
|
+
disabled?: boolean;
|
|
25
|
+
/** Form input name attribute. */
|
|
26
|
+
name?: string;
|
|
27
|
+
/** Default NUI event name sent on any state change. */
|
|
28
|
+
eventName?: string;
|
|
29
|
+
/** NUI event name sent specifically when checked (overrides eventName). */
|
|
30
|
+
onCheck?: string;
|
|
31
|
+
/** NUI event name sent specifically when unchecked (overrides eventName). */
|
|
32
|
+
onUncheck?: string;
|
|
33
|
+
/** Optional change callback fired on state toggle. */
|
|
34
|
+
onChange?: (checked: boolean) => void;
|
|
35
|
+
/** SvelteNuiClient instance for event transport. */
|
|
36
|
+
client?: SvelteNuiClient;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const autoId = $props.id();
|
|
40
|
+
|
|
41
|
+
let {
|
|
42
|
+
id,
|
|
43
|
+
eventName = '',
|
|
44
|
+
client = nui,
|
|
45
|
+
value = $bindable(false),
|
|
46
|
+
label = '',
|
|
47
|
+
description = '',
|
|
48
|
+
ariaLabel,
|
|
49
|
+
disabled = false,
|
|
50
|
+
indeterminate = $bindable(false),
|
|
51
|
+
onCheck = '',
|
|
52
|
+
onUncheck = '',
|
|
53
|
+
onChange,
|
|
54
|
+
name = ''
|
|
55
|
+
}: Props = $props();
|
|
56
|
+
|
|
57
|
+
let element = $state<HTMLInputElement | undefined>(undefined);
|
|
58
|
+
|
|
59
|
+
const inputId = $derived(id || autoId);
|
|
60
|
+
const descId = $derived(description ? `${inputId}-desc` : undefined);
|
|
61
|
+
const resolvedAriaLabel = $derived(!label ? (ariaLabel || 'Checkbox') : undefined);
|
|
62
|
+
|
|
63
|
+
$effect(() => {
|
|
64
|
+
if (element) {
|
|
65
|
+
element.indeterminate = indeterminate;
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
function handleChange(event: Event) {
|
|
70
|
+
if (disabled) return;
|
|
71
|
+
const next = (event.currentTarget as HTMLInputElement).checked;
|
|
72
|
+
indeterminate = false;
|
|
73
|
+
value = next;
|
|
74
|
+
|
|
75
|
+
const targetEvent = next ? (onCheck || eventName) : (onUncheck || eventName);
|
|
76
|
+
if (targetEvent) {
|
|
77
|
+
try {
|
|
78
|
+
client.send(targetEvent, { value: next });
|
|
79
|
+
} catch (err) {
|
|
80
|
+
console.error(
|
|
81
|
+
`[fivem-nui-components] Failed to send checkbox event '${targetEvent}':`,
|
|
82
|
+
err
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
onChange?.(next);
|
|
88
|
+
}
|
|
89
|
+
</script>
|
|
90
|
+
|
|
91
|
+
<label class="nui-checkbox" class:is-disabled={disabled} for={inputId}>
|
|
92
|
+
<input
|
|
93
|
+
bind:this={element}
|
|
94
|
+
id={inputId}
|
|
95
|
+
class="nui-checkbox__input"
|
|
96
|
+
type="checkbox"
|
|
97
|
+
checked={value}
|
|
98
|
+
{disabled}
|
|
99
|
+
{name}
|
|
100
|
+
aria-label={resolvedAriaLabel}
|
|
101
|
+
aria-describedby={descId}
|
|
102
|
+
onchange={handleChange}
|
|
103
|
+
/>
|
|
104
|
+
<span
|
|
105
|
+
class="nui-checkbox__track"
|
|
106
|
+
class:checked={value}
|
|
107
|
+
class:indeterminate={indeterminate}
|
|
108
|
+
aria-hidden="true"
|
|
109
|
+
>
|
|
110
|
+
<span class="nui-checkbox__thumb"></span>
|
|
111
|
+
</span>
|
|
112
|
+
{#if label || description}
|
|
113
|
+
<span class="nui-checkbox__text">
|
|
114
|
+
{#if label}<span class="nui-checkbox__label">{label}</span>{/if}
|
|
115
|
+
{#if description}<span id={descId} class="nui-checkbox__description">{description}</span>{/if}
|
|
116
|
+
</span>
|
|
117
|
+
{/if}
|
|
118
|
+
</label>
|
|
119
|
+
|
|
120
|
+
<style>
|
|
121
|
+
.nui-checkbox {
|
|
122
|
+
display: inline-flex;
|
|
123
|
+
align-items: center;
|
|
124
|
+
gap: 0.625rem;
|
|
125
|
+
cursor: pointer;
|
|
126
|
+
user-select: none;
|
|
127
|
+
font-family: inherit;
|
|
128
|
+
color: var(--nui-fg, #fafafa);
|
|
129
|
+
vertical-align: middle;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.nui-checkbox.is-disabled {
|
|
133
|
+
opacity: 0.5;
|
|
134
|
+
cursor: not-allowed;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.nui-checkbox__input {
|
|
138
|
+
position: absolute;
|
|
139
|
+
opacity: 0;
|
|
140
|
+
width: 0;
|
|
141
|
+
height: 0;
|
|
142
|
+
margin: 0;
|
|
143
|
+
padding: 0;
|
|
144
|
+
pointer-events: none;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.nui-checkbox__track {
|
|
148
|
+
position: relative;
|
|
149
|
+
flex: none;
|
|
150
|
+
width: 2.25rem;
|
|
151
|
+
height: 1.25rem;
|
|
152
|
+
padding: 0.125rem;
|
|
153
|
+
border-radius: 999px;
|
|
154
|
+
background: var(--nui-surface-alt, #3f3f46);
|
|
155
|
+
border: 1px solid var(--nui-border, #52525b);
|
|
156
|
+
transition: background 0.2s ease, border-color 0.2s ease;
|
|
157
|
+
box-sizing: border-box;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.nui-checkbox__input:focus-visible + .nui-checkbox__track {
|
|
161
|
+
outline: 2px solid var(--nui-primary, #3b82f6);
|
|
162
|
+
outline-offset: 3px;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.nui-checkbox__input:checked + .nui-checkbox__track,
|
|
166
|
+
.nui-checkbox__track.checked {
|
|
167
|
+
background: var(--nui-primary, #3b82f6);
|
|
168
|
+
border-color: var(--nui-primary, #3b82f6);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.nui-checkbox__input:indeterminate + .nui-checkbox__track,
|
|
172
|
+
.nui-checkbox__track.indeterminate {
|
|
173
|
+
background: var(--nui-primary, #3b82f6);
|
|
174
|
+
border-color: var(--nui-primary, #3b82f6);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.nui-checkbox__thumb {
|
|
178
|
+
display: block;
|
|
179
|
+
width: 0.95rem;
|
|
180
|
+
height: 0.95rem;
|
|
181
|
+
border-radius: 50%;
|
|
182
|
+
background: #fff;
|
|
183
|
+
transition: transform 0.2s ease;
|
|
184
|
+
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.nui-checkbox__track.checked .nui-checkbox__thumb {
|
|
188
|
+
transform: translateX(1rem);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.nui-checkbox__track.indeterminate .nui-checkbox__thumb {
|
|
192
|
+
transform: translateX(0.5rem);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.nui-checkbox__text {
|
|
196
|
+
display: flex;
|
|
197
|
+
flex-direction: column;
|
|
198
|
+
gap: 0.125rem;
|
|
199
|
+
line-height: 1.3;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.nui-checkbox__label {
|
|
203
|
+
font-size: 0.875rem;
|
|
204
|
+
font-weight: 500;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.nui-checkbox__description {
|
|
208
|
+
font-size: 0.75rem;
|
|
209
|
+
color: var(--nui-fg-secondary, #a1a1aa);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
@media (prefers-reduced-motion: reduce) {
|
|
213
|
+
.nui-checkbox__track,
|
|
214
|
+
.nui-checkbox__thumb {
|
|
215
|
+
transition: none;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
</style>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { SvelteNuiClient } from '@fivem-nui/svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Optional HTML id attribute. Defaults to a unique generated id via $props.id(). */
|
|
4
|
+
id?: string;
|
|
5
|
+
/** Current checked state. Supports two-way binding. */
|
|
6
|
+
value?: boolean;
|
|
7
|
+
/** Text label displayed next to checkbox. */
|
|
8
|
+
label?: string;
|
|
9
|
+
/** Secondary description text displayed below label. */
|
|
10
|
+
description?: string;
|
|
11
|
+
/** Accessible label for screen readers when visual label is omitted. */
|
|
12
|
+
ariaLabel?: string;
|
|
13
|
+
/** Whether checkbox is in an indeterminate state. Supports two-way binding. */
|
|
14
|
+
indeterminate?: boolean;
|
|
15
|
+
/** Whether checkbox is disabled. */
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
/** Form input name attribute. */
|
|
18
|
+
name?: string;
|
|
19
|
+
/** Default NUI event name sent on any state change. */
|
|
20
|
+
eventName?: string;
|
|
21
|
+
/** NUI event name sent specifically when checked (overrides eventName). */
|
|
22
|
+
onCheck?: string;
|
|
23
|
+
/** NUI event name sent specifically when unchecked (overrides eventName). */
|
|
24
|
+
onUncheck?: string;
|
|
25
|
+
/** Optional change callback fired on state toggle. */
|
|
26
|
+
onChange?: (checked: boolean) => void;
|
|
27
|
+
/** SvelteNuiClient instance for event transport. */
|
|
28
|
+
client?: SvelteNuiClient;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* NuiCheckbox
|
|
32
|
+
* Accessible toggle checkbox component with FiveM NUI event synchronization,
|
|
33
|
+
* intermediate state support, and keyboard accessibility.
|
|
34
|
+
*/
|
|
35
|
+
declare const NuiCheckbox: import("svelte").Component<Props, {}, "value" | "indeterminate">;
|
|
36
|
+
type NuiCheckbox = ReturnType<typeof NuiCheckbox>;
|
|
37
|
+
export default NuiCheckbox;
|