@vuetify/v0 0.1.3 → 0.1.4
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/adapter-BN-h5JbD.d.mts +344 -0
- package/dist/adapter-CJIj5ySf.d.mts +11 -0
- package/dist/adapter-D_0ptsPm.mjs +229 -0
- package/dist/adapters-BQ-Lr3PW.mjs +1 -0
- package/dist/adapters-DEXpW9If.mjs +1 -0
- package/dist/adapters-Q9WaOsJp.mjs +1 -0
- package/dist/adapters-SSDVth5e.mjs +1 -0
- package/dist/browser/index.js +359 -933
- package/dist/components/index.d.mts +19 -6
- package/dist/components/index.mjs +37 -5
- package/dist/{components-C0zEvP7w.mjs → components-CMuzTJdK.mjs} +11 -4
- package/dist/composables/index.d.mts +17 -4
- package/dist/composables/index.mjs +36 -4
- package/dist/consola-DiUk9j3y.d.mts +15 -0
- package/dist/consola-GBy8XRuL.mjs +31 -0
- package/dist/constants/index.d.mts +1 -1
- package/dist/constants/index.mjs +3 -3
- package/dist/constants-B8pMSkcW.mjs +1 -0
- package/dist/createDataTable-BJnmvxfb.mjs +387 -0
- package/dist/createGroup-CPhp6FUh.mjs +363 -0
- package/dist/createPagination-cyOWlpfH.mjs +234 -0
- package/dist/createSelection-uqEbFgha.mjs +261 -0
- package/dist/createSingle-B59ya3aa.mjs +179 -0
- package/dist/createTokens-BlhLdHXE.mjs +682 -0
- package/dist/createTrinity-EeHQSsb6.mjs +149 -0
- package/dist/data-table/adapters/client/index.d.mts +3 -0
- package/dist/data-table/adapters/client/index.mjs +9 -0
- package/dist/data-table/adapters/index.d.mts +5 -0
- package/dist/data-table/adapters/index.mjs +12 -0
- package/dist/data-table/adapters/server/index.d.mts +3 -0
- package/dist/data-table/adapters/server/index.mjs +7 -0
- package/dist/data-table/adapters/virtual/index.d.mts +3 -0
- package/dist/data-table/adapters/virtual/index.mjs +9 -0
- package/dist/data-table/index.d.mts +7 -0
- package/dist/data-table/index.mjs +25 -0
- package/dist/date/index.d.mts +1 -1
- package/dist/date/index.mjs +2 -2
- package/dist/features/adapters/flagsmith/index.d.mts +16 -0
- package/dist/features/adapters/flagsmith/index.mjs +3 -0
- package/dist/features/adapters/launchdarkly/index.d.mts +15 -0
- package/dist/features/adapters/launchdarkly/index.mjs +3 -0
- package/dist/features/adapters/posthog/index.d.mts +15 -0
- package/dist/features/adapters/posthog/index.mjs +4 -0
- package/dist/features/index.d.mts +17 -0
- package/dist/features/index.mjs +18 -0
- package/dist/flagsmith-CHmpPGR7.mjs +40 -0
- package/dist/{globals-BwYsH-rt.mjs → globals-B_GVfG06.mjs} +2 -2
- package/dist/index-7mWYFHA6.d.mts +251 -0
- package/dist/index-BDTbJClL.d.mts +11 -0
- package/dist/index-BuOz3Rgm.d.mts +32 -0
- package/dist/{index-Bmem4l8m.d.mts → index-Bv1VN_j5.d.mts} +1 -1
- package/dist/{index-DFM5iBqh.d.mts → index-CQrDeqsK.d.mts} +280 -279
- package/dist/{index-2wh69fk5.d.mts → index-Dd0m0LIJ.d.mts} +135 -1407
- package/dist/{index-DBZTizq2.d.mts → index-UNwEBkQT.d.mts} +16 -2
- package/dist/index.d.mts +20 -7
- package/dist/index.mjs +39 -7
- package/dist/json/web-types.json +1 -1
- package/dist/launchdarkly-W8t8ZANX.mjs +28 -0
- package/dist/locale/adapters/index.d.mts +3 -0
- package/dist/locale/adapters/index.mjs +6 -0
- package/dist/locale/adapters/v0/index.d.mts +3 -0
- package/dist/locale/adapters/v0/index.mjs +5 -0
- package/dist/locale/index.d.mts +17 -0
- package/dist/locale/index.mjs +17 -0
- package/dist/logger/adapters/consola/index.d.mts +3 -0
- package/dist/logger/adapters/consola/index.mjs +3 -0
- package/dist/logger/adapters/index.d.mts +5 -0
- package/dist/logger/adapters/index.mjs +8 -0
- package/dist/logger/adapters/pino/index.d.mts +3 -0
- package/dist/logger/adapters/pino/index.mjs +5 -0
- package/dist/logger/adapters/v0/index.d.mts +3 -0
- package/dist/logger/adapters/v0/index.mjs +5 -0
- package/dist/logger/index.d.mts +17 -0
- package/dist/logger/index.mjs +10 -0
- package/dist/memory-BsZGbGnG.mjs +27 -0
- package/dist/memory-DVjquu_v.d.mts +25 -0
- package/dist/permissions/adapters/index.d.mts +18 -0
- package/dist/permissions/adapters/index.mjs +6 -0
- package/dist/permissions/adapters/v0/index.d.mts +18 -0
- package/dist/permissions/adapters/v0/index.mjs +5 -0
- package/dist/permissions/index.d.mts +17 -0
- package/dist/permissions/index.mjs +15 -0
- package/dist/pino-01x_NmWp.mjs +49 -0
- package/dist/pino-p-jDkNQd.d.mts +24 -0
- package/dist/posthog-BrGBPPir.mjs +50 -0
- package/dist/server-6cs14bj1.d.mts +20 -0
- package/dist/server-ClCwiLMA.mjs +45 -0
- package/dist/storage/adapters/index.d.mts +3 -0
- package/dist/storage/adapters/index.mjs +3 -0
- package/dist/storage/adapters/memory/index.d.mts +2 -0
- package/dist/storage/adapters/memory/index.mjs +3 -0
- package/dist/storage/index.d.mts +17 -0
- package/dist/storage/index.mjs +37 -0
- package/dist/theme/adapters/index.d.mts +17 -0
- package/dist/theme/adapters/index.mjs +6 -0
- package/dist/theme/adapters/v0/index.d.mts +17 -0
- package/dist/theme/adapters/v0/index.mjs +5 -0
- package/dist/theme/index.d.mts +17 -0
- package/dist/theme/index.mjs +16 -0
- package/dist/toArray-DIeXVX1C.mjs +38 -0
- package/dist/types/index.d.mts +1 -1
- package/dist/useClickOutside-p8HP07At.mjs +4680 -0
- package/dist/useFeatures-C4JF3Hgr.mjs +122 -0
- package/dist/useLocale-DlbShzF-.mjs +85 -0
- package/dist/useLogger-CO9JwbSJ.mjs +283 -0
- package/dist/usePermissions-DQVT_4nD.mjs +128 -0
- package/dist/useTheme-Bcw1Ebyt.mjs +135 -0
- package/dist/utilities/index.d.mts +3 -3
- package/dist/utilities/index.mjs +3 -3
- package/dist/{utilities-BbKjbXTx.mjs → utilities-BqS1sC1W.mjs} +20 -3
- package/dist/v0-B40YkIQ-.mjs +21 -0
- package/dist/v0-BOxb3nD1.d.mts +33 -0
- package/dist/v0-BogbIzpM.mjs +41 -0
- package/dist/v0-BtQCSBOG.mjs +37 -0
- package/dist/v0-C-9dv_1S.d.mts +10 -0
- package/dist/v0-CtjuUUPl.mjs +73 -0
- package/dist/v0-DHMoZ7dS.d.mts +22 -0
- package/dist/v0-ONBWyQYQ.mjs +83 -0
- package/dist/v0-RepwEY1F.d.mts +9 -0
- package/dist/virtual-B3IPkHC0.d.mts +9 -0
- package/dist/virtual-BP9WXRzN.mjs +44 -0
- package/package.json +34 -2
- package/dist/useClickOutside-DrkNYxDe.mjs +0 -8871
- /package/dist/{adapter-D95FHAtt.d.mts → adapter-DcwxFryd.d.mts} +0 -0
- /package/dist/{constants-DHKqjdjH.mjs → adapters-BGJKsBrw.mjs} +0 -0
- /package/dist/{htmlElements-DO9n35bD.mjs → htmlElements-d8iBCGpO.mjs} +0 -0
- /package/dist/{index-BLK67J_-.d.mts → index-BFBN5Zl3.d.mts} +0 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { h as isUndefined, v as useId$1 } from "./utilities-BqS1sC1W.mjs";
|
|
2
|
+
import { i as useContext, n as createContext, t as createTrinity } from "./createTrinity-EeHQSsb6.mjs";
|
|
3
|
+
import { i as createRegistry } from "./createTokens-BlhLdHXE.mjs";
|
|
4
|
+
import { computed, shallowReactive, toRef, toValue } from "vue";
|
|
5
|
+
|
|
6
|
+
//#region src/composables/createSelection/index.ts
|
|
7
|
+
/**
|
|
8
|
+
* @module useSelection
|
|
9
|
+
*
|
|
10
|
+
* @remarks
|
|
11
|
+
* Base composable for managing selected items in a collection with Set-based tracking.
|
|
12
|
+
*
|
|
13
|
+
* Key features:
|
|
14
|
+
* - Set-based selectedIds for O(1) selection checks
|
|
15
|
+
* - Mandatory selection mode (prevents deselecting last item)
|
|
16
|
+
* - Auto-enrollment option (selects non-disabled items on register)
|
|
17
|
+
* - Disabled item filtering
|
|
18
|
+
* - Computed selectedItems and selectedValues Sets
|
|
19
|
+
*
|
|
20
|
+
* Extends useRegistry and serves as the base for useSingle, useGroup, useStep, and useFeatures.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Creates a new selection instance for managing multiple selected items.
|
|
24
|
+
*
|
|
25
|
+
* Extends `useRegistry` with selection tracking via a reactive `Set` of selected IDs.
|
|
26
|
+
* Supports disabled items, mandatory selection enforcement, and auto-enrollment.
|
|
27
|
+
*
|
|
28
|
+
* @param options The options for the selection instance.
|
|
29
|
+
* @template Z The input ticket type - what users provide to register(). Extend SelectionTicketInput to add custom properties.
|
|
30
|
+
* @template E The output ticket type - what users receive from get(). Automatically includes selection methods.
|
|
31
|
+
* @template R The context type. Defaults to SelectionContext<Z, E>.
|
|
32
|
+
* @returns A new selection instance with selection management methods.
|
|
33
|
+
*
|
|
34
|
+
* @remarks
|
|
35
|
+
* **Key Features:**
|
|
36
|
+
* - Multi-selection support (unlike `useSingle` which enforces single selection)
|
|
37
|
+
* - Set-based `selectedIds` tracking for efficient lookups
|
|
38
|
+
* - Computed `selectedItems` and `selectedValues` for reactive access
|
|
39
|
+
* - Each ticket gets `isSelected`, `select()`, `unselect()`, and `toggle()` methods
|
|
40
|
+
* - Disabled items cannot be selected
|
|
41
|
+
* - Mandatory mode prevents deselecting the last item
|
|
42
|
+
* - Force mode auto-selects first non-disabled item on registration
|
|
43
|
+
* - Enroll option auto-selects all non-disabled items on registration
|
|
44
|
+
*
|
|
45
|
+
* **Inheritance Chain:**
|
|
46
|
+
* `useRegistry` → `createSelection` → `createSingle`/`createGroup` → `createStep`
|
|
47
|
+
*
|
|
48
|
+
* @see https://0.vuetifyjs.com/composables/selection/use-selection
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```ts
|
|
52
|
+
* import { createSelection } from '@vuetify/v0'
|
|
53
|
+
*
|
|
54
|
+
* // Basic usage
|
|
55
|
+
* const selection = createSelection({ mandatory: true })
|
|
56
|
+
*
|
|
57
|
+
* selection.onboard([
|
|
58
|
+
* { id: 'item-1', value: 'Item 1' },
|
|
59
|
+
* { id: 'item-2', value: 'Item 2', disabled: true },
|
|
60
|
+
* { id: 'item-3', value: 'Item 3' },
|
|
61
|
+
* ])
|
|
62
|
+
*
|
|
63
|
+
* selection.select('item-1')
|
|
64
|
+
* selection.select('item-3')
|
|
65
|
+
*
|
|
66
|
+
* console.log(selection.selectedIds) // Set { 'item-1', 'item-3' }
|
|
67
|
+
* console.log(Array.from(selection.selectedValues.value)) // ['Item 1', 'Item 3']
|
|
68
|
+
* ```
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```ts
|
|
72
|
+
* // With custom ticket type
|
|
73
|
+
* interface MyTicket extends SelectionTicketInput {
|
|
74
|
+
* label: string
|
|
75
|
+
* icon?: string
|
|
76
|
+
* }
|
|
77
|
+
*
|
|
78
|
+
* const tabs = createSelection<MyTicket>()
|
|
79
|
+
*
|
|
80
|
+
* tabs.register({ label: 'Home', icon: 'mdi-home' })
|
|
81
|
+
* tabs.register({ label: 'Settings' })
|
|
82
|
+
*
|
|
83
|
+
* const ticket = tabs.get('...')
|
|
84
|
+
* // ticket has: label, icon, isSelected, select(), unselect(), toggle()
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
function createSelection(_options = {}) {
|
|
88
|
+
const { disabled = false, enroll = false, mandatory = false, multiple = false, ...options } = _options;
|
|
89
|
+
const registry = createRegistry(options);
|
|
90
|
+
const selectedIds = shallowReactive(/* @__PURE__ */ new Set());
|
|
91
|
+
const selectedItems = computed(() => {
|
|
92
|
+
return new Set(Array.from(selectedIds).map((id) => registry.get(id)).filter((item) => !/* @__PURE__ */ isUndefined(item)));
|
|
93
|
+
});
|
|
94
|
+
const selectedValues = computed(() => {
|
|
95
|
+
return new Set(Array.from(selectedItems.value).map((item) => item.value));
|
|
96
|
+
});
|
|
97
|
+
function seek(direction = "first", from) {
|
|
98
|
+
return registry.seek(direction, from, (ticket) => !toValue(ticket.disabled));
|
|
99
|
+
}
|
|
100
|
+
function mandate() {
|
|
101
|
+
if (!toValue(mandatory) || registry.size === 0 || selectedIds.size > 0) return;
|
|
102
|
+
const ticket = seek("first");
|
|
103
|
+
if (ticket) select(ticket.id);
|
|
104
|
+
}
|
|
105
|
+
function select(id) {
|
|
106
|
+
if (toValue(disabled)) return;
|
|
107
|
+
const item = registry.get(id);
|
|
108
|
+
if (!item || toValue(item.disabled)) return;
|
|
109
|
+
if (!toValue(multiple)) selectedIds.clear();
|
|
110
|
+
selectedIds.add(id);
|
|
111
|
+
}
|
|
112
|
+
function unselect(id) {
|
|
113
|
+
if (toValue(disabled)) return;
|
|
114
|
+
if (toValue(mandatory) && selectedIds.size === 1) return;
|
|
115
|
+
selectedIds.delete(id);
|
|
116
|
+
}
|
|
117
|
+
function toggle(id) {
|
|
118
|
+
if (toValue(disabled)) return;
|
|
119
|
+
if (selected(id)) unselect(id);
|
|
120
|
+
else select(id);
|
|
121
|
+
}
|
|
122
|
+
function selected(id) {
|
|
123
|
+
return selectedIds.has(id);
|
|
124
|
+
}
|
|
125
|
+
function register(registration = {}) {
|
|
126
|
+
const id = registration.id ?? /* @__PURE__ */ useId$1();
|
|
127
|
+
const item = {
|
|
128
|
+
disabled: false,
|
|
129
|
+
select: () => select(id),
|
|
130
|
+
unselect: () => unselect(id),
|
|
131
|
+
toggle: () => toggle(id),
|
|
132
|
+
isSelected: toRef(() => selected(id)),
|
|
133
|
+
...registration,
|
|
134
|
+
id
|
|
135
|
+
};
|
|
136
|
+
const ticket = registry.register(item);
|
|
137
|
+
if (toValue(enroll) && !toValue(disabled) && !toValue(item.disabled)) select(ticket.id);
|
|
138
|
+
if (toValue(mandatory) === "force") mandate();
|
|
139
|
+
return ticket;
|
|
140
|
+
}
|
|
141
|
+
function unregister(id) {
|
|
142
|
+
selectedIds.delete(id);
|
|
143
|
+
registry.unregister(id);
|
|
144
|
+
}
|
|
145
|
+
function offboard(ids) {
|
|
146
|
+
for (const id of ids) selectedIds.delete(id);
|
|
147
|
+
registry.offboard(ids);
|
|
148
|
+
}
|
|
149
|
+
function onboard(registrations) {
|
|
150
|
+
const tickets = registry.batch(() => registrations.map((registration) => register(registration)));
|
|
151
|
+
if (toValue(mandatory) === "force") mandate();
|
|
152
|
+
return tickets;
|
|
153
|
+
}
|
|
154
|
+
function reset() {
|
|
155
|
+
registry.clear();
|
|
156
|
+
selectedIds.clear();
|
|
157
|
+
mandate();
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
...registry,
|
|
161
|
+
disabled,
|
|
162
|
+
selectedIds,
|
|
163
|
+
selectedItems,
|
|
164
|
+
selectedValues,
|
|
165
|
+
register,
|
|
166
|
+
unregister,
|
|
167
|
+
onboard,
|
|
168
|
+
offboard,
|
|
169
|
+
reset,
|
|
170
|
+
mandate,
|
|
171
|
+
seek,
|
|
172
|
+
select,
|
|
173
|
+
unselect,
|
|
174
|
+
toggle,
|
|
175
|
+
selected,
|
|
176
|
+
get size() {
|
|
177
|
+
return registry.size;
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Creates a new selection context.
|
|
183
|
+
*
|
|
184
|
+
* @param options The options for the selection context.
|
|
185
|
+
* @template Z The input ticket type - what users provide to register().
|
|
186
|
+
* @template E The output ticket type - what users receive from get().
|
|
187
|
+
* @template R The context type. Defaults to SelectionContext<Z, E>.
|
|
188
|
+
* @returns A new selection context.
|
|
189
|
+
*
|
|
190
|
+
* @see https://0.vuetifyjs.com/composables/selection/use-selection
|
|
191
|
+
*
|
|
192
|
+
* @example
|
|
193
|
+
* ```ts
|
|
194
|
+
* import { createSelectionContext } from '@vuetify/v0'
|
|
195
|
+
*
|
|
196
|
+
* // With default namespace 'v0:selection'
|
|
197
|
+
* export const [useCheckboxes, provideCheckboxes, checkboxes] = createSelectionContext()
|
|
198
|
+
*
|
|
199
|
+
* // Or with custom namespace
|
|
200
|
+
* export const [useCheckboxes, provideCheckboxes, checkboxes] = createSelectionContext({ namespace: 'checkboxes' })
|
|
201
|
+
*
|
|
202
|
+
* // In a parent component:
|
|
203
|
+
* provideCheckboxes()
|
|
204
|
+
*
|
|
205
|
+
* // In a child component:
|
|
206
|
+
* const checkboxes = useCheckboxes()
|
|
207
|
+
* checkboxes.select('checkbox-1')
|
|
208
|
+
* ```
|
|
209
|
+
*
|
|
210
|
+
* @example
|
|
211
|
+
* ```ts
|
|
212
|
+
* // With custom ticket type
|
|
213
|
+
* interface TabTicket extends SelectionTicketInput {
|
|
214
|
+
* label: string
|
|
215
|
+
* icon?: string
|
|
216
|
+
* }
|
|
217
|
+
*
|
|
218
|
+
* export const [useTabs, provideTabs, tabs] = createSelectionContext<TabTicket>()
|
|
219
|
+
* ```
|
|
220
|
+
*/
|
|
221
|
+
function createSelectionContext(_options = {}) {
|
|
222
|
+
const { namespace = "v0:selection", ...options } = _options;
|
|
223
|
+
const [useSelectionContext, _provideSelectionContext] = createContext(namespace);
|
|
224
|
+
const context = createSelection(options);
|
|
225
|
+
function provideSelectionContext(_context = context, app) {
|
|
226
|
+
return _provideSelectionContext(_context, app);
|
|
227
|
+
}
|
|
228
|
+
return createTrinity(useSelectionContext, provideSelectionContext, context);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Returns the current selection instance.
|
|
232
|
+
*
|
|
233
|
+
* @param namespace The namespace for the selection context. Defaults to `'v0:selection'`.
|
|
234
|
+
* @template Z The input ticket type.
|
|
235
|
+
* @template E The output ticket type.
|
|
236
|
+
* @template R The context type.
|
|
237
|
+
* @returns The current selection instance.
|
|
238
|
+
*
|
|
239
|
+
* @see https://0.vuetifyjs.com/composables/selection/use-selection
|
|
240
|
+
*
|
|
241
|
+
* @example
|
|
242
|
+
* ```vue
|
|
243
|
+
* <script setup lang="ts">
|
|
244
|
+
* import { useSelection } from '@vuetify/v0'
|
|
245
|
+
*
|
|
246
|
+
* const selection = useSelection()
|
|
247
|
+
* <\/script>
|
|
248
|
+
*
|
|
249
|
+
* <template>
|
|
250
|
+
* <div>
|
|
251
|
+
* <p>Selected: {{ selection.selectedIds.size }}</p>
|
|
252
|
+
* </div>
|
|
253
|
+
* </template>
|
|
254
|
+
* ```
|
|
255
|
+
*/
|
|
256
|
+
function useSelection(namespace = "v0:selection") {
|
|
257
|
+
return useContext(namespace);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
//#endregion
|
|
261
|
+
export { createSelectionContext as n, useSelection as r, createSelection as t };
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { i as useContext, n as createContext, t as createTrinity } from "./createTrinity-EeHQSsb6.mjs";
|
|
2
|
+
import { t as createSelection } from "./createSelection-uqEbFgha.mjs";
|
|
3
|
+
import { computed } from "vue";
|
|
4
|
+
|
|
5
|
+
//#region src/composables/createSingle/index.ts
|
|
6
|
+
/**
|
|
7
|
+
* @module useSingle
|
|
8
|
+
*
|
|
9
|
+
* @remarks
|
|
10
|
+
* Single-selection composable that extends useSelection to enforce only one selected item.
|
|
11
|
+
*
|
|
12
|
+
* Key features:
|
|
13
|
+
* - Auto-clears previous selection when selecting new item
|
|
14
|
+
* - Singular computed properties (selectedId, selectedItem, selectedIndex, selectedValue)
|
|
15
|
+
* - Perfect for tabs, radio buttons, theme selectors
|
|
16
|
+
*
|
|
17
|
+
* Inheritance chain: useRegistry → useSelection → useSingle
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Creates a new single selection instance that enforces only one selected item at a time.
|
|
21
|
+
*
|
|
22
|
+
* Extends `createSelection` by automatically clearing previous selections when a new item is selected.
|
|
23
|
+
* Adds computed singular properties: `selectedId`, `selectedItem`, `selectedIndex`, `selectedValue`.
|
|
24
|
+
*
|
|
25
|
+
* @param options The options for the single selection instance.
|
|
26
|
+
* @template Z The input ticket type - what users provide to register().
|
|
27
|
+
* @template E The output ticket type - what users receive from get().
|
|
28
|
+
* @template R The context type.
|
|
29
|
+
* @returns A new single selection instance with single-selection enforcement.
|
|
30
|
+
*
|
|
31
|
+
* @remarks
|
|
32
|
+
* **Key Differences from `createSelection`:**
|
|
33
|
+
* - Automatically clears `selectedIds` before selecting a new item (enforces single selection)
|
|
34
|
+
* - Provides singular computed properties instead of plural sets
|
|
35
|
+
* - Perfect for tabs, radio buttons, theme selectors, and other single-choice UI components
|
|
36
|
+
*
|
|
37
|
+
* **Computed Properties:**
|
|
38
|
+
* - `selectedId`: The ID of the selected item (undefined if none selected)
|
|
39
|
+
* - `selectedItem`: The selected ticket object (undefined if none selected)
|
|
40
|
+
* - `selectedIndex`: The index of the selected item (-1 if none selected)
|
|
41
|
+
* - `selectedValue`: The value of the selected item (undefined if none selected)
|
|
42
|
+
*
|
|
43
|
+
* **Inheritance Chain:**
|
|
44
|
+
* `useRegistry` → `createSelection` → `createSingle` → `createStep`
|
|
45
|
+
*
|
|
46
|
+
* @see https://0.vuetifyjs.com/composables/selection/use-single
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* import { createSingle } from '@vuetify/v0'
|
|
51
|
+
*
|
|
52
|
+
* const tabs = createSingle({ mandatory: true })
|
|
53
|
+
*
|
|
54
|
+
* tabs.onboard([
|
|
55
|
+
* { id: 'home', value: 'Home' },
|
|
56
|
+
* { id: 'about', value: 'About' },
|
|
57
|
+
* { id: 'contact', value: 'Contact' },
|
|
58
|
+
* ])
|
|
59
|
+
*
|
|
60
|
+
* tabs.first() // Select first tab
|
|
61
|
+
*
|
|
62
|
+
* console.log(tabs.selectedId.value) // 'home'
|
|
63
|
+
* console.log(tabs.selectedIndex.value) // 0
|
|
64
|
+
*
|
|
65
|
+
* tabs.select('about') // Switch to about tab
|
|
66
|
+
* console.log(tabs.selectedId.value) // 'about'
|
|
67
|
+
* console.log(tabs.selectedIds.size) // 1 (always enforces single selection)
|
|
68
|
+
* ```
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```ts
|
|
72
|
+
* // With custom ticket type
|
|
73
|
+
* interface TabTicket extends SingleTicketInput {
|
|
74
|
+
* label: string
|
|
75
|
+
* icon?: string
|
|
76
|
+
* }
|
|
77
|
+
*
|
|
78
|
+
* const tabs = createSingle<TabTicket>()
|
|
79
|
+
* tabs.register({ label: 'Home', icon: 'mdi-home' })
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
function createSingle(_options = {}) {
|
|
83
|
+
const { mandatory = false, multiple = false, ...options } = _options;
|
|
84
|
+
const registry = createSelection({
|
|
85
|
+
...options,
|
|
86
|
+
mandatory,
|
|
87
|
+
multiple
|
|
88
|
+
});
|
|
89
|
+
const selectedId = computed(() => registry.selectedIds.values().next().value);
|
|
90
|
+
const selectedItem = computed(() => registry.selectedItems.value.values().next().value);
|
|
91
|
+
const selectedIndex = computed(() => selectedItem.value?.index ?? -1);
|
|
92
|
+
const selectedValue = computed(() => selectedItem.value?.value);
|
|
93
|
+
function unselect(id) {
|
|
94
|
+
registry.unselect(id);
|
|
95
|
+
}
|
|
96
|
+
function toggle(id) {
|
|
97
|
+
if (registry.selectedIds.has(id)) unselect(id);
|
|
98
|
+
else registry.select(id);
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
...registry,
|
|
102
|
+
selectedId,
|
|
103
|
+
selectedItem,
|
|
104
|
+
selectedIndex,
|
|
105
|
+
selectedValue,
|
|
106
|
+
unselect,
|
|
107
|
+
toggle,
|
|
108
|
+
get size() {
|
|
109
|
+
return registry.size;
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Creates a new single selection context.
|
|
115
|
+
*
|
|
116
|
+
* @param options The options for the single selection context.
|
|
117
|
+
* @template Z The input ticket type.
|
|
118
|
+
* @template E The output ticket type.
|
|
119
|
+
* @template R The context type.
|
|
120
|
+
* @returns A new single selection context.
|
|
121
|
+
*
|
|
122
|
+
* @see https://0.vuetifyjs.com/composables/selection/use-single
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```ts
|
|
126
|
+
* import { createSingleContext } from '@vuetify/v0'
|
|
127
|
+
*
|
|
128
|
+
* // With default namespace 'v0:single'
|
|
129
|
+
* export const [useSingle, provideSingle, context] = createSingleContext()
|
|
130
|
+
*
|
|
131
|
+
* // In a parent component:
|
|
132
|
+
* provideSingle()
|
|
133
|
+
*
|
|
134
|
+
* // In a child component:
|
|
135
|
+
* const single = useSingle()
|
|
136
|
+
* single.select('tab-1')
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
139
|
+
function createSingleContext(_options = {}) {
|
|
140
|
+
const { namespace = "v0:single", ...options } = _options;
|
|
141
|
+
const [useSingleContext, _provideSingleContext] = createContext(namespace);
|
|
142
|
+
const context = createSingle(options);
|
|
143
|
+
function provideSingleContext(_context = context, app) {
|
|
144
|
+
return _provideSingleContext(_context, app);
|
|
145
|
+
}
|
|
146
|
+
return createTrinity(useSingleContext, provideSingleContext, context);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Returns the current single selection instance.
|
|
150
|
+
*
|
|
151
|
+
* @param namespace The namespace for the single selection context. Defaults to `'v0:single'`.
|
|
152
|
+
* @template Z The input ticket type.
|
|
153
|
+
* @template E The output ticket type.
|
|
154
|
+
* @template R The context type.
|
|
155
|
+
* @returns The current single selection instance.
|
|
156
|
+
*
|
|
157
|
+
* @see https://0.vuetifyjs.com/composables/selection/use-single
|
|
158
|
+
*
|
|
159
|
+
* @example
|
|
160
|
+
* ```vue
|
|
161
|
+
* <script setup lang="ts">
|
|
162
|
+
* import { useSingle } from '@vuetify/v0'
|
|
163
|
+
*
|
|
164
|
+
* const tabs = useSingle()
|
|
165
|
+
* <\/script>
|
|
166
|
+
*
|
|
167
|
+
* <template>
|
|
168
|
+
* <div>
|
|
169
|
+
* <p>Selected: {{ tabs.selectedId }}</p>
|
|
170
|
+
* </div>
|
|
171
|
+
* </template>
|
|
172
|
+
* ```
|
|
173
|
+
*/
|
|
174
|
+
function useSingle(namespace = "v0:single") {
|
|
175
|
+
return useContext(namespace);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
//#endregion
|
|
179
|
+
export { createSingleContext as n, useSingle as r, createSingle as t };
|