|
@@ -31,43 +31,53 @@ function handleGroup(el, Alpine) {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
-function handleLabel(el, Alpine) {
|
|
|
- Alpine.bind(el, {
|
|
|
- 'x-init'() { this.$data.__hasLabel = true },
|
|
|
- ':id'() { return this.$id('alpine-switch-label') },
|
|
|
- '@click'() {
|
|
|
- this.$data.__switchEl.click()
|
|
|
- this.$data.__switchEl.focus({ preventScroll: true })
|
|
|
- },
|
|
|
- })
|
|
|
-}
|
|
|
-
|
|
|
-function handleDescription(el, Alpine) {
|
|
|
- Alpine.bind(el, {
|
|
|
- 'x-init'() { this.$data.__hasDescription = true },
|
|
|
- ':id'() { return this.$id('alpine-switch-description') },
|
|
|
- })
|
|
|
-}
|
|
|
-
|
|
|
function handleRoot(el, Alpine) {
|
|
|
Alpine.bind(el, {
|
|
|
+ 'x-modelable': '__value',
|
|
|
'x-data'() {
|
|
|
return {
|
|
|
init() {
|
|
|
- // Need the "microtask" here so that x-model has a chance to initialize.
|
|
|
queueMicrotask(() => {
|
|
|
- // Set our internal "selected" every time the x-modeled value changes.
|
|
|
- Alpine.effect(() => {
|
|
|
- this.__value = this.$el._x_model.get()
|
|
|
- })
|
|
|
+ this.__value = Alpine.bound(this.$el, 'default-checked', false)
|
|
|
+ this.__inputName = Alpine.bound(this.$el, 'name', false)
|
|
|
+ this.__inputValue = Alpine.bound(this.$el, 'value', 'on')
|
|
|
+ this.__inputId = Date.now()
|
|
|
})
|
|
|
},
|
|
|
__value: undefined,
|
|
|
+ __inputName: undefined,
|
|
|
+ __inputValue: undefined,
|
|
|
+ __inputId: undefined,
|
|
|
__toggle() {
|
|
|
- this.$el._x_model.set(!this.__value)
|
|
|
+ this.__value = ! this.__value;
|
|
|
},
|
|
|
}
|
|
|
},
|
|
|
+ 'x-effect'() {
|
|
|
+ let value = this.__value
|
|
|
+
|
|
|
+ // Only render a hidden input if the "name" prop is passed...
|
|
|
+ if (! this.__inputName) return
|
|
|
+
|
|
|
+ // First remove a previously appended hidden input (if it exists)...
|
|
|
+ let nextEl = this.$el.nextElementSibling
|
|
|
+ if (nextEl && String(nextEl.id) === String(this.__inputId)) {
|
|
|
+ nextEl.remove()
|
|
|
+ }
|
|
|
+
|
|
|
+ // If the value is true, create the input and append it, otherwise,
|
|
|
+ // we already removed it in the previous step...
|
|
|
+ if (value) {
|
|
|
+ let input = document.createElement('input')
|
|
|
+
|
|
|
+ input.type = 'hidden'
|
|
|
+ input.value = this.__inputValue
|
|
|
+ input.name = this.__inputName
|
|
|
+ input.id = this.__inputId
|
|
|
+
|
|
|
+ this.$el.after(input)
|
|
|
+ }
|
|
|
+ },
|
|
|
'x-init'() {
|
|
|
if (this.$el.tagName.toLowerCase() === 'button' && !this.$el.hasAttribute('type')) this.$el.type = 'button'
|
|
|
this.$data.__switchEl = this.$el
|
|
@@ -76,7 +86,7 @@ function handleRoot(el, Alpine) {
|
|
|
'tabindex': "0",
|
|
|
':aria-checked'() { return !!this.__value },
|
|
|
':aria-labelledby'() { return this.$data.__hasLabel && this.$id('alpine-switch-label') },
|
|
|
- ':aria-describedby'() { return this.$data.__hasDescription && this.$id('alpine-switch-description') },
|
|
|
+ ':aria-describedby'() { return this.$data.true__hasDescription && this.$id('alpine-switch-description') },
|
|
|
'@click.prevent'() { this.__toggle() },
|
|
|
'@keyup'(e) {
|
|
|
if (e.key !== 'Tab') e.preventDefault()
|
|
@@ -86,3 +96,22 @@ function handleRoot(el, Alpine) {
|
|
|
'@keypress.prevent'() { },
|
|
|
})
|
|
|
}
|
|
|
+
|
|
|
+function handleLabel(el, Alpine) {
|
|
|
+ Alpine.bind(el, {
|
|
|
+ 'x-init'() { this.$data.__hasLabel = true },
|
|
|
+ ':id'() { return this.$id('alpine-switch-label') },
|
|
|
+ '@click'() {
|
|
|
+ this.$data.__switchEl.click()
|
|
|
+ this.$data.__switchEl.focus({ preventScroll: true })
|
|
|
+ },
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+function handleDescription(el, Alpine) {
|
|
|
+ Alpine.bind(el, {
|
|
|
+ 'x-init'() { this.$data.__hasDescription = true },
|
|
|
+ ':id'() { return this.$id('alpine-switch-description') },
|
|
|
+ })
|
|
|
+}
|
|
|
+
|