@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.
Files changed (143) hide show
  1. package/README.md +101 -2
  2. package/dist/components/actions/NuiButton.svelte +292 -0
  3. package/dist/components/actions/NuiButton.svelte.d.ts +60 -0
  4. package/dist/components/data/NuiBadge.svelte +277 -0
  5. package/dist/components/data/NuiBadge.svelte.d.ts +74 -0
  6. package/dist/components/data/NuiCodeBlock.svelte +256 -0
  7. package/dist/components/data/NuiCodeBlock.svelte.d.ts +49 -0
  8. package/dist/components/data/NuiList.svelte +341 -0
  9. package/dist/components/data/NuiList.svelte.d.ts +52 -0
  10. package/dist/components/data/NuiProgressBar.svelte +264 -0
  11. package/dist/components/data/NuiProgressBar.svelte.d.ts +51 -0
  12. package/dist/components/data/NuiRichText.svelte +260 -0
  13. package/dist/components/data/NuiRichText.svelte.d.ts +33 -0
  14. package/dist/components/data/NuiTable.svelte +470 -0
  15. package/dist/components/data/NuiTable.svelte.d.ts +53 -0
  16. package/dist/components/data/chart/NuiChart.svelte +384 -0
  17. package/dist/components/data/chart/NuiChart.svelte.d.ts +49 -0
  18. package/dist/components/data/chart/color.d.ts +9 -0
  19. package/dist/components/data/chart/color.js +78 -0
  20. package/dist/components/data/chart/index.d.ts +10 -0
  21. package/dist/components/data/chart/index.js +10 -0
  22. package/dist/components/data/chart/registry.d.ts +14 -0
  23. package/dist/components/data/chart/registry.js +53 -0
  24. package/dist/components/data/chart/renderers/bar.d.ts +8 -0
  25. package/dist/components/data/chart/renderers/bar.js +79 -0
  26. package/dist/components/data/chart/renderers/base.d.ts +18 -0
  27. package/dist/components/data/chart/renderers/base.js +10 -0
  28. package/dist/components/data/chart/renderers/line.d.ts +8 -0
  29. package/dist/components/data/chart/renderers/line.js +89 -0
  30. package/dist/components/data/chart/renderers/pie.d.ts +10 -0
  31. package/dist/components/data/chart/renderers/pie.js +55 -0
  32. package/dist/components/data/chart/scale.d.ts +22 -0
  33. package/dist/components/data/chart/scale.js +101 -0
  34. package/dist/components/data/chart/types.d.ts +84 -0
  35. package/dist/components/data/chart/types.js +1 -0
  36. package/dist/components/data/chart/validator.d.ts +10 -0
  37. package/dist/components/data/chart/validator.js +82 -0
  38. package/dist/components/forms/NuiCheckbox.svelte +218 -0
  39. package/dist/components/forms/NuiCheckbox.svelte.d.ts +37 -0
  40. package/dist/components/forms/NuiDatepicker.svelte +755 -0
  41. package/dist/components/forms/NuiDatepicker.svelte.d.ts +34 -0
  42. package/dist/components/forms/NuiFileInput.svelte +1047 -0
  43. package/dist/components/forms/NuiFileInput.svelte.d.ts +93 -0
  44. package/dist/components/forms/NuiFileInput.types.d.ts +28 -0
  45. package/dist/components/forms/NuiFileInput.types.js +1 -0
  46. package/dist/components/forms/NuiForm.svelte +391 -0
  47. package/dist/components/forms/NuiForm.svelte.d.ts +69 -0
  48. package/dist/components/forms/NuiInput.svelte +296 -0
  49. package/dist/components/forms/NuiInput.svelte.d.ts +62 -0
  50. package/dist/components/forms/NuiRadioGroup.svelte +238 -0
  51. package/dist/components/forms/NuiRadioGroup.svelte.d.ts +47 -0
  52. package/dist/components/forms/NuiSelect.svelte +819 -0
  53. package/dist/components/forms/NuiSelect.svelte.d.ts +49 -0
  54. package/dist/components/layout/NuiCard.svelte +314 -0
  55. package/dist/components/layout/NuiCard.svelte.d.ts +48 -0
  56. package/dist/components/layout/NuiCardGrid.svelte +98 -0
  57. package/dist/components/layout/NuiCardGrid.svelte.d.ts +22 -0
  58. package/dist/components/layout/NuiFlex.svelte +121 -0
  59. package/dist/components/layout/NuiFlex.svelte.d.ts +23 -0
  60. package/dist/components/layout/NuiGrid.svelte +66 -0
  61. package/dist/components/layout/NuiGrid.svelte.d.ts +14 -0
  62. package/dist/components/layout/NuiStack.svelte +138 -0
  63. package/dist/components/layout/NuiStack.svelte.d.ts +26 -0
  64. package/dist/components/navigation/NuiAccordion.svelte +323 -0
  65. package/dist/components/navigation/NuiAccordion.svelte.d.ts +38 -0
  66. package/dist/components/navigation/NuiBreadcrumbs.svelte +133 -0
  67. package/dist/components/navigation/NuiBreadcrumbs.svelte.d.ts +19 -0
  68. package/dist/components/navigation/NuiMenu.svelte +596 -0
  69. package/dist/components/navigation/NuiMenu.svelte.d.ts +28 -0
  70. package/dist/components/navigation/NuiPagination.svelte +306 -0
  71. package/dist/components/navigation/NuiPagination.svelte.d.ts +40 -0
  72. package/dist/components/navigation/NuiSidebar.svelte +186 -0
  73. package/dist/components/navigation/NuiSidebar.svelte.d.ts +26 -0
  74. package/dist/components/navigation/NuiTabs.svelte +249 -0
  75. package/dist/components/navigation/NuiTabs.svelte.d.ts +31 -0
  76. package/dist/components/overlay/NuiDialog.svelte +118 -0
  77. package/dist/components/overlay/NuiDialog.svelte.d.ts +34 -0
  78. package/dist/components/overlay/NuiModal.svelte +992 -0
  79. package/dist/components/overlay/NuiModal.svelte.d.ts +72 -0
  80. package/dist/components/overlay/NuiTooltip.svelte +159 -0
  81. package/dist/components/overlay/NuiTooltip.svelte.d.ts +13 -0
  82. package/dist/composables/useClickOutside.d.ts +43 -0
  83. package/dist/composables/useClickOutside.js +73 -0
  84. package/dist/composables/useFormValidation.d.ts +23 -0
  85. package/dist/composables/useFormValidation.js +72 -0
  86. package/dist/composables/useIdle.svelte.d.ts +18 -0
  87. package/dist/composables/useIdle.svelte.js +144 -0
  88. package/dist/composables/useKeyboardShortcut.svelte.d.ts +114 -0
  89. package/dist/composables/useKeyboardShortcut.svelte.js +153 -0
  90. package/dist/composables/useLocalStorage.svelte.d.ts +22 -0
  91. package/dist/composables/useLocalStorage.svelte.js +105 -0
  92. package/dist/composables/useMediaQuery.svelte.d.ts +51 -0
  93. package/dist/composables/useMediaQuery.svelte.js +80 -0
  94. package/dist/index.d.ts +46 -0
  95. package/dist/index.js +42 -0
  96. package/package.json +58 -3
  97. package/src/components/actions/NuiButton.svelte +292 -0
  98. package/src/components/data/NuiBadge.svelte +277 -0
  99. package/src/components/data/NuiCodeBlock.svelte +256 -0
  100. package/src/components/data/NuiList.svelte +341 -0
  101. package/src/components/data/NuiProgressBar.svelte +264 -0
  102. package/src/components/data/NuiRichText.svelte +260 -0
  103. package/src/components/data/NuiTable.svelte +470 -0
  104. package/src/components/data/chart/NuiChart.svelte +384 -0
  105. package/src/components/data/chart/color.ts +83 -0
  106. package/src/components/data/chart/index.ts +10 -0
  107. package/src/components/data/chart/registry.ts +71 -0
  108. package/src/components/data/chart/renderers/bar.ts +90 -0
  109. package/src/components/data/chart/renderers/base.ts +32 -0
  110. package/src/components/data/chart/renderers/line.ts +99 -0
  111. package/src/components/data/chart/renderers/pie.ts +66 -0
  112. package/src/components/data/chart/scale.ts +139 -0
  113. package/src/components/data/chart/types.ts +98 -0
  114. package/src/components/data/chart/validator.ts +98 -0
  115. package/src/components/forms/NuiCheckbox.svelte +218 -0
  116. package/src/components/forms/NuiDatepicker.svelte +755 -0
  117. package/src/components/forms/NuiFileInput.svelte +1047 -0
  118. package/src/components/forms/NuiFileInput.types.ts +29 -0
  119. package/src/components/forms/NuiForm.svelte +391 -0
  120. package/src/components/forms/NuiInput.svelte +296 -0
  121. package/src/components/forms/NuiRadioGroup.svelte +238 -0
  122. package/src/components/forms/NuiSelect.svelte +819 -0
  123. package/src/components/layout/NuiCard.svelte +314 -0
  124. package/src/components/layout/NuiCardGrid.svelte +98 -0
  125. package/src/components/layout/NuiFlex.svelte +121 -0
  126. package/src/components/layout/NuiGrid.svelte +66 -0
  127. package/src/components/layout/NuiStack.svelte +138 -0
  128. package/src/components/navigation/NuiAccordion.svelte +323 -0
  129. package/src/components/navigation/NuiBreadcrumbs.svelte +133 -0
  130. package/src/components/navigation/NuiMenu.svelte +596 -0
  131. package/src/components/navigation/NuiPagination.svelte +306 -0
  132. package/src/components/navigation/NuiSidebar.svelte +186 -0
  133. package/src/components/navigation/NuiTabs.svelte +249 -0
  134. package/src/components/overlay/NuiDialog.svelte +118 -0
  135. package/src/components/overlay/NuiModal.svelte +992 -0
  136. package/src/components/overlay/NuiTooltip.svelte +159 -0
  137. package/src/composables/useClickOutside.ts +132 -0
  138. package/src/composables/useFormValidation.ts +105 -0
  139. package/src/composables/useIdle.svelte.ts +191 -0
  140. package/src/composables/useKeyboardShortcut.svelte.ts +278 -0
  141. package/src/composables/useLocalStorage.svelte.ts +137 -0
  142. package/src/composables/useMediaQuery.svelte.ts +102 -0
  143. 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>