@gospore/checkbox 1.0.65 → 1.0.67

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 CHANGED
@@ -4,6 +4,10 @@ The Checkbox component wraps a native `<input type="checkbox">` inside a styled
4
4
  label. It supports controlled boolean state as well as checkbox groups driven by
5
5
  an array value.
6
6
 
7
+ Group values may be strings or objects. Object values are matched by identity
8
+ for both pointer and Enter-key activation, so reuse the same object instance in
9
+ the bound array when it represents the same option.
10
+
7
11
  Any additional attributes (e.g., `name`, `aria-describedby`, `required`) are
8
12
  forwarded to the hidden input element.
9
13
 
@@ -33,9 +33,9 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
33
33
  default: boolean;
34
34
  };
35
35
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
36
- click: (event: KeyboardEvent | MouseEvent) => any;
37
- keyup: (event: KeyboardEvent) => any;
38
36
  "update:checked": (value: CheckboxChecked) => any;
37
+ keyup: (event: KeyboardEvent) => any;
38
+ click: (event: MouseEvent | KeyboardEvent) => any;
39
39
  }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
40
40
  /**
41
41
  * Controlled state. Pass a boolean for single checkboxes or an array for checkbox groups (the
@@ -64,9 +64,9 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
64
64
  default: boolean;
65
65
  };
66
66
  }>> & Readonly<{
67
- onClick?: (event: KeyboardEvent | MouseEvent) => any;
68
- onKeyup?: (event: KeyboardEvent) => any;
69
67
  "onUpdate:checked"?: (value: CheckboxChecked) => any;
68
+ onKeyup?: (event: KeyboardEvent) => any;
69
+ onClick?: (event: MouseEvent | KeyboardEvent) => any;
70
70
  }>, {
71
71
  value: CheckboxValue;
72
72
  label: string;
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));let c=require("vue"),l=require("@fortawesome/vue-fontawesome"),u=require("@fortawesome/free-solid-svg-icons"),d=require("lodash/without.js");d=s(d,1);let f=require("@gospore/skeleton");function p(e){return e?m(e()):!1}function m(e){return h(e)}function h(e){let t=new WeakSet,n=new WeakSet,r=[{kind:`value`,value:e}];for(;r.length>0;){let e=r.pop();if(e.kind===`leave-array`){t.delete(e.array);continue}let i=e.value;if(Array.isArray(i)){g(r,i,t);continue}if(typeof i==`string`){if(i.trim()!==``)return!0;continue}if(typeof i==`number`)return!0;if(!(!(0,c.isVNode)(i)||!_(i))){if(i.type===c.Fragment){if(n.has(i))continue;n.add(i),r.push({kind:`value`,value:i.children});continue}return!0}}return!1}function g(e,t,n){if(!n.has(t)){n.add(t),e.push({array:t,kind:`leave-array`});for(let n=t.length-1;n>=0;--n)e.push({kind:`value`,value:t[n]})}}function _(e){return e.type===c.Comment?!1:e.type!==c.Text||typeof e.children==`string`&&e.children.trim()!==``}var v=[`title`],y={class:`checkbox-input-container`},b=[`value`,`checked`,`disabled`],x={key:0,class:`checkbox-label`},S={key:1,class:`checkbox-label`},C=(0,c.defineComponent)({name:`Checkbox`,inheritAttrs:!1,__name:`Checkbox`,props:{checked:{type:[Boolean,Array],default:!1},value:{type:[String,Object],default:``},label:{type:String,default:``},disabled:{type:Boolean,default:!1}},emits:[`update:checked`,`keyup`,`click`],setup(e,{emit:t}){let n=e,r=t,i=(0,c.useAttrs)(),a=(0,c.useSlots)(),o=(0,c.ref)(!1),s=(0,c.ref)(n.checked),f=(0,c.computed)(()=>p(a.default)),m=(0,c.computed)(()=>typeof s.value==`boolean`?s.value:s.value.includes(n.value)),h=(0,c.computed)(()=>{let{class:e,...t}=i;return Object.assign({},t,{onClick(e){n.disabled||r(`click`,e)},onKeyup(e){r(`keyup`,e),!n.disabled&&e.key===`Enter`&&(r(`click`,e),typeof s.value==`boolean`?s.value=!s.value:s.value.includes(n.value)?s.value=(0,d.default)(s.value,n.value):s.value=[...s.value,n.value])}})});function g(e){let t=e.currentTarget.checked;if(typeof s.value==`boolean`){s.value=t;return}t&&!s.value.includes(n.value)?s.value=[...s.value,n.value]:!t&&s.value.includes(n.value)&&(s.value=(0,d.default)(s.value,n.value))}return(0,c.watch)(()=>n.checked,e=>{s.value=e}),(0,c.watch)(()=>s.value,()=>{s.value!=n.checked&&r(`update:checked`,s.value)}),(t,n)=>((0,c.openBlock)(),(0,c.createElementBlock)(`label`,{class:(0,c.normalizeClass)([`checkbox`,{"checkbox-disabled":e.disabled},(0,c.unref)(i).class]),title:(0,c.unref)(i).title},[(0,c.createElementVNode)(`span`,y,[(0,c.createElementVNode)(`span`,{class:(0,c.normalizeClass)([`checkbox-input`,{"checkbox-checked":m.value,"checkbox-focused":o.value}])},[(0,c.createVNode)((0,c.unref)(l.FontAwesomeIcon),{class:`checkbox-input-icon`,icon:(0,c.unref)(u.faCheck),"aria-hidden":`true`},null,8,[`icon`]),(0,c.createElementVNode)(`input`,(0,c.mergeProps)(h.value,{type:`checkbox`,value:e.value,checked:m.value,disabled:e.disabled,onChange:g,onFocus:n[0]||=e=>o.value=!0,onFocusout:n[1]||=e=>o.value=!1}),null,16,b)],2)]),f.value?((0,c.openBlock)(),(0,c.createElementBlock)(`span`,x,[(0,c.renderSlot)(t.$slots,`default`,{},void 0,!0)])):((0,c.openBlock)(),(0,c.createElementBlock)(`span`,S,(0,c.toDisplayString)(e.label),1))],10,v))}}),w=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},T=w(C,[[`__scopeId`,`data-v-2c346baa`]]),E={class:`checkbox-skeleton`},D=w((0,c.defineComponent)({name:`CheckboxSkeleton`,__name:`CheckboxSkeleton`,props:{labelWidth:{type:[String,Number],default:`10rem`},shimmer:{type:Boolean,default:!1}},setup(e){return(t,n)=>((0,c.openBlock)(),(0,c.createElementBlock)(`div`,E,[(0,c.createVNode)((0,c.unref)(f.Skeleton),{width:`var(--size-20)`,height:`var(--size-20)`,radius:`var(--border-radius-regular)`,shimmer:e.shimmer},null,8,[`shimmer`]),(0,c.createVNode)((0,c.unref)(f.Skeleton),{width:e.labelWidth,height:`var(--size-16)`,shimmer:e.shimmer},null,8,[`width`,`shimmer`])]))}}),[[`__scopeId`,`data-v-472ff734`]]);exports.Checkbox=T,exports.CheckboxSkeleton=D;
2
+ //# sourceMappingURL=checkbox.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkbox.cjs","names":[],"sources":["../../../shared/slot.ts","../src/Checkbox.vue","../src/Checkbox.vue","../src/CheckboxSkeleton.vue","../src/CheckboxSkeleton.vue"],"sourcesContent":["import { Comment, Fragment, isVNode, Text } from \"vue\";\nimport type { VNode, VNodeArrayChildren } from \"vue\";\n\ntype SlotFunction = () => unknown;\n\ntype TraversalEntry = { kind: \"value\"; value: unknown } | { array: unknown[]; kind: \"leave-array\" };\n\nexport function collectRenderableVNodes(children: VNodeArrayChildren | VNode[]): VNode[] {\n const nodes: VNode[] = [];\n const activeArrays = new WeakSet<unknown[]>();\n const stack: TraversalEntry[] = [];\n pushArray(stack, children as unknown[], activeArrays);\n\n while (stack.length > 0) {\n const entry = stack.pop()!;\n if (entry.kind === \"leave-array\") {\n activeArrays.delete(entry.array);\n continue;\n }\n\n const child = entry.value;\n if (Array.isArray(child)) {\n pushArray(stack, child, activeArrays);\n continue;\n }\n if (!isVNode(child) || !isRenderableVNode(child)) {\n continue;\n }\n if (child.type === Fragment && Array.isArray(child.children)) {\n pushArray(stack, child.children, activeArrays);\n continue;\n }\n nodes.push(child);\n }\n\n return nodes;\n}\n\nexport function hasRenderableSlotContent(slot?: SlotFunction): boolean {\n if (!slot) {\n return false;\n }\n\n return hasRenderableVNodeContent(slot());\n}\n\nexport function hasRenderableVNodeContent(children: unknown): boolean {\n return isRenderableSlotChild(children);\n}\n\nexport function collectSlotText(children: VNodeArrayChildren): string {\n const chunks: string[] = [];\n const activeArrays = new WeakSet<unknown[]>();\n const stack: TraversalEntry[] = [];\n pushArray(stack, children as unknown[], activeArrays);\n\n while (stack.length > 0) {\n const entry = stack.pop()!;\n if (entry.kind === \"leave-array\") {\n activeArrays.delete(entry.array);\n continue;\n }\n\n const child = entry.value;\n if (Array.isArray(child)) {\n pushArray(stack, child, activeArrays);\n continue;\n }\n if (typeof child === \"string\" || typeof child === \"number\") {\n chunks.push(String(child));\n continue;\n }\n if (!isVNode(child) || child.type === Comment) {\n continue;\n }\n if (typeof child.children === \"string\") {\n chunks.push(child.children);\n continue;\n }\n if (Array.isArray(child.children)) {\n pushArray(stack, child.children, activeArrays);\n }\n }\n\n return chunks.join(\"\").replace(/\\s+/g, \" \").trim();\n}\n\nfunction isRenderableSlotChild(child: unknown): boolean {\n const activeArrays = new WeakSet<unknown[]>();\n const visitedFragments = new WeakSet<VNode>();\n const stack: TraversalEntry[] = [{ kind: \"value\", value: child }];\n\n while (stack.length > 0) {\n const entry = stack.pop()!;\n if (entry.kind === \"leave-array\") {\n activeArrays.delete(entry.array);\n continue;\n }\n\n const current = entry.value;\n if (Array.isArray(current)) {\n pushArray(stack, current, activeArrays);\n continue;\n }\n if (typeof current === \"string\") {\n if (current.trim() !== \"\") {\n return true;\n }\n continue;\n }\n if (typeof current === \"number\") {\n return true;\n }\n if (!isVNode(current) || !isRenderableVNode(current)) {\n continue;\n }\n if (current.type === Fragment) {\n if (visitedFragments.has(current)) {\n continue;\n }\n visitedFragments.add(current);\n stack.push({ kind: \"value\", value: current.children });\n continue;\n }\n return true;\n }\n\n return false;\n}\n\nfunction pushArray(stack: TraversalEntry[], array: unknown[], activeArrays: WeakSet<unknown[]>) {\n if (activeArrays.has(array)) {\n return;\n }\n\n activeArrays.add(array);\n stack.push({ array, kind: \"leave-array\" });\n for (let index = array.length - 1; index >= 0; index -= 1) {\n stack.push({ kind: \"value\", value: array[index] });\n }\n}\n\nfunction isRenderableVNode(node: VNode): boolean {\n if (node.type === Comment) {\n return false;\n }\n if (node.type === Text) {\n return typeof node.children === \"string\" && node.children.trim() !== \"\";\n }\n return true;\n}\n","<template>\n <label\n :class=\"['checkbox', { 'checkbox-disabled': disabled }, defaultAttrs.class]\"\n :title=\"defaultAttrs.title\"\n >\n <span class=\"checkbox-input-container\">\n <span\n :class=\"[\n 'checkbox-input',\n {\n 'checkbox-checked': isChecked,\n 'checkbox-focused': focused,\n },\n ]\"\n >\n <font-awesome-icon class=\"checkbox-input-icon\" :icon=\"faCheck\" aria-hidden=\"true\" />\n <input\n v-bind=\"attrs\"\n type=\"checkbox\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n @change=\"handleChange\"\n @focus=\"focused = true\"\n @focusout=\"focused = false\"\n />\n </span>\n </span>\n <span v-if=\"hasDefaultContent\" class=\"checkbox-label\">\n <slot />\n </span>\n <span v-else class=\"checkbox-label\">{{ label }}</span>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { useAttrs, ref, computed, watch } from \"vue\";\nimport type { PropType } from \"vue\";\nimport { FontAwesomeIcon } from \"@fortawesome/vue-fontawesome\";\nimport { faCheck } from \"@fortawesome/free-solid-svg-icons\";\nimport without from \"lodash/without.js\";\nimport { hasRenderableSlotContent } from \"../../../shared/slot\";\n\ntype CheckboxValue = string | Record<string, unknown>;\ntype CheckboxChecked = boolean | CheckboxValue[];\n\ndefineOptions({\n name: \"Checkbox\",\n inheritAttrs: false,\n});\nconst props = defineProps({\n /**\n * Controlled state. Pass a boolean for single checkboxes or an array for checkbox groups (the\n * component will push/pop value). Supports v-model:checked.\n */\n checked: {\n type: [Boolean, Array] as PropType<CheckboxChecked>,\n default: false,\n },\n /**\n * The value inserted or removed from the bound array when used in group mode. Ignored for\n * boolean usage.\n */\n value: {\n type: [String, Object] as PropType<CheckboxValue>,\n default: \"\",\n },\n /** Fallback label text when no default slot is provided. */\n label: {\n type: String,\n default: \"\",\n },\n /** Greys out the checkbox and prevents user interaction. */\n disabled: {\n type: Boolean,\n default: false,\n },\n});\nconst emit = defineEmits([\"update:checked\", \"keyup\", \"click\"]);\nconst defaultAttrs = useAttrs() as Record<string, unknown> & {\n class?: unknown;\n title?: string;\n};\nconst slots = defineSlots<{\n /** Custom label content rendered next to the checkbox input. */\n default?: () => unknown;\n}>();\nconst focused = ref(false);\nconst internalChecked = ref<CheckboxChecked>(props.checked);\nconst hasDefaultContent = computed(() => hasRenderableSlotContent(slots.default));\n\nconst isChecked = computed(() => {\n if (typeof internalChecked.value === \"boolean\") {\n return internalChecked.value;\n } else {\n return internalChecked.value.includes(props.value);\n }\n});\nconst attrs = computed(() => {\n const { class: omittedClass, ...inputAttrs } = defaultAttrs;\n void omittedClass;\n return Object.assign({}, inputAttrs, {\n onClick(event: MouseEvent) {\n if (!props.disabled) {\n emit(\"click\", event);\n }\n },\n // Pressing the enter key gets handled like a click.\n onKeyup(event: KeyboardEvent) {\n emit(\"keyup\", event);\n if (props.disabled) {\n return;\n }\n if (event.key === \"Enter\") {\n emit(\"click\", event);\n if (typeof internalChecked.value == \"boolean\") {\n internalChecked.value = !internalChecked.value;\n } else {\n if (internalChecked.value.includes(props.value)) {\n internalChecked.value = without(internalChecked.value, props.value);\n } else {\n internalChecked.value = [...internalChecked.value, props.value];\n }\n }\n }\n },\n });\n});\n\nfunction handleChange(event: Event) {\n const checked = (event.currentTarget as HTMLInputElement).checked;\n\n if (typeof internalChecked.value === \"boolean\") {\n internalChecked.value = checked;\n return;\n }\n\n if (checked && !internalChecked.value.includes(props.value)) {\n internalChecked.value = [...internalChecked.value, props.value];\n } else if (!checked && internalChecked.value.includes(props.value)) {\n internalChecked.value = without(internalChecked.value, props.value);\n }\n}\n\nwatch(\n () => props.checked,\n (checked) => {\n internalChecked.value = checked;\n },\n);\nwatch(\n () => internalChecked.value,\n () => {\n // Only emit the update:checked event if the mutation came from within the checkbox component.\n if (internalChecked.value != props.checked) {\n emit(\"update:checked\", internalChecked.value);\n }\n },\n);\n</script>\n\n<style>\n@import \"theme.css\";\n</style>\n\n<style lang=\"less\" scoped>\n.checkbox {\n position: relative;\n display: flex;\n padding: var(--checkbox-padding);\n\n .checkbox-input-container {\n padding: 5px;\n }\n .checkbox-input {\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--checkbox-height);\n width: var(--checkbox-width);\n box-sizing: border-box;\n border-radius: var(--checkbox-border-radius);\n border: var(--checkbox-border-width) solid;\n background-color: var(--checkbox-background-default-default-light);\n color: var(--checkbox-color-default-default-light);\n border-color: var(--checkbox-border-color-default-default-light);\n transition: var(--checkbox-transition);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-light);\n color: var(--checkbox-color-default-hover-light);\n border-color: var(--checkbox-border-color-default-hover-light);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-light);\n color: var(--checkbox-color-default-active-light);\n border-color: var(--checkbox-border-color-default-active-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-light);\n color: var(--checkbox-color-checked-default-light);\n border-color: var(--checkbox-border-color-checked-default-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-light);\n color: var(--checkbox-color-checked-hover-light);\n border-color: var(--checkbox-border-color-checked-hover-light);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-light);\n color: var(--checkbox-color-checked-active-light);\n border-color: var(--checkbox-border-color-checked-active-light);\n }\n}\n.checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-light);\n cursor: not-allowed;\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n}\n.checkbox-input-icon {\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n padding: 1px;\n}\n.checkbox-label {\n padding: var(--checkbox-label-padding);\n line-height: var(--checkbox-line-height);\n}\ninput {\n margin: 0;\n opacity: 0;\n position: absolute;\n pointer-events: none;\n}\n[data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-light) !important;\n}\n\n[dark-mode=\"true\"] {\n .checkbox {\n .checkbox-input {\n background-color: var(--checkbox-background-default-default-dark);\n color: var(--checkbox-color-default-default-dark);\n border-color: var(--checkbox-border-color-default-default-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-dark);\n color: var(--checkbox-color-default-hover-dark);\n border-color: var(--checkbox-border-color-default-hover-dark);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-dark);\n color: var(--checkbox-color-default-active-dark);\n border-color: var(--checkbox-border-color-default-active-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-dark);\n color: var(--checkbox-color-checked-default-dark);\n border-color: var(--checkbox-border-color-checked-default-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-dark);\n color: var(--checkbox-color-checked-hover-dark);\n border-color: var(--checkbox-border-color-checked-hover-dark);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-dark);\n color: var(--checkbox-color-checked-active-dark);\n border-color: var(--checkbox-border-color-checked-active-dark);\n }\n }\n .checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-dark);\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n }\n\n [data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-dark) !important;\n }\n}\n</style>\n","<template>\n <label\n :class=\"['checkbox', { 'checkbox-disabled': disabled }, defaultAttrs.class]\"\n :title=\"defaultAttrs.title\"\n >\n <span class=\"checkbox-input-container\">\n <span\n :class=\"[\n 'checkbox-input',\n {\n 'checkbox-checked': isChecked,\n 'checkbox-focused': focused,\n },\n ]\"\n >\n <font-awesome-icon class=\"checkbox-input-icon\" :icon=\"faCheck\" aria-hidden=\"true\" />\n <input\n v-bind=\"attrs\"\n type=\"checkbox\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n @change=\"handleChange\"\n @focus=\"focused = true\"\n @focusout=\"focused = false\"\n />\n </span>\n </span>\n <span v-if=\"hasDefaultContent\" class=\"checkbox-label\">\n <slot />\n </span>\n <span v-else class=\"checkbox-label\">{{ label }}</span>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { useAttrs, ref, computed, watch } from \"vue\";\nimport type { PropType } from \"vue\";\nimport { FontAwesomeIcon } from \"@fortawesome/vue-fontawesome\";\nimport { faCheck } from \"@fortawesome/free-solid-svg-icons\";\nimport without from \"lodash/without.js\";\nimport { hasRenderableSlotContent } from \"../../../shared/slot\";\n\ntype CheckboxValue = string | Record<string, unknown>;\ntype CheckboxChecked = boolean | CheckboxValue[];\n\ndefineOptions({\n name: \"Checkbox\",\n inheritAttrs: false,\n});\nconst props = defineProps({\n /**\n * Controlled state. Pass a boolean for single checkboxes or an array for checkbox groups (the\n * component will push/pop value). Supports v-model:checked.\n */\n checked: {\n type: [Boolean, Array] as PropType<CheckboxChecked>,\n default: false,\n },\n /**\n * The value inserted or removed from the bound array when used in group mode. Ignored for\n * boolean usage.\n */\n value: {\n type: [String, Object] as PropType<CheckboxValue>,\n default: \"\",\n },\n /** Fallback label text when no default slot is provided. */\n label: {\n type: String,\n default: \"\",\n },\n /** Greys out the checkbox and prevents user interaction. */\n disabled: {\n type: Boolean,\n default: false,\n },\n});\nconst emit = defineEmits<{\n \"update:checked\": [value: CheckboxChecked];\n keyup: [event: KeyboardEvent];\n click: [event: MouseEvent | KeyboardEvent];\n}>();\nconst defaultAttrs = useAttrs() as Record<string, unknown> & {\n class?: unknown;\n title?: string;\n};\nconst slots = defineSlots<{\n /** Custom label content rendered next to the checkbox input. */\n default?: () => unknown;\n}>();\nconst focused = ref(false);\nconst internalChecked = ref<CheckboxChecked>(props.checked);\nconst hasDefaultContent = computed(() => hasRenderableSlotContent(slots.default));\n\nconst isChecked = computed(() => {\n if (typeof internalChecked.value === \"boolean\") {\n return internalChecked.value;\n } else {\n return internalChecked.value.includes(props.value);\n }\n});\nconst attrs = computed(() => {\n const { class: omittedClass, ...inputAttrs } = defaultAttrs;\n void omittedClass;\n return Object.assign({}, inputAttrs, {\n onClick(event: MouseEvent) {\n if (!props.disabled) {\n emit(\"click\", event);\n }\n },\n // Pressing the enter key gets handled like a click.\n onKeyup(event: KeyboardEvent) {\n emit(\"keyup\", event);\n if (props.disabled) {\n return;\n }\n if (event.key === \"Enter\") {\n emit(\"click\", event);\n if (typeof internalChecked.value == \"boolean\") {\n internalChecked.value = !internalChecked.value;\n } else {\n if (internalChecked.value.includes(props.value)) {\n internalChecked.value = without(internalChecked.value, props.value);\n } else {\n internalChecked.value = [...internalChecked.value, props.value];\n }\n }\n }\n },\n });\n});\n\nfunction handleChange(event: Event) {\n const checked = (event.currentTarget as HTMLInputElement).checked;\n\n if (typeof internalChecked.value === \"boolean\") {\n internalChecked.value = checked;\n return;\n }\n\n if (checked && !internalChecked.value.includes(props.value)) {\n internalChecked.value = [...internalChecked.value, props.value];\n } else if (!checked && internalChecked.value.includes(props.value)) {\n internalChecked.value = without(internalChecked.value, props.value);\n }\n}\n\nwatch(\n () => props.checked,\n (checked) => {\n internalChecked.value = checked;\n },\n);\nwatch(\n () => internalChecked.value,\n () => {\n // Only emit the update:checked event if the mutation came from within the checkbox component.\n if (internalChecked.value != props.checked) {\n emit(\"update:checked\", internalChecked.value);\n }\n },\n);\n</script>\n\n<style>\n@import \"theme.css\";\n</style>\n\n<style lang=\"less\" scoped>\n.checkbox {\n position: relative;\n display: flex;\n padding: var(--checkbox-padding);\n\n .checkbox-input-container {\n padding: 5px;\n }\n .checkbox-input {\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--checkbox-height);\n width: var(--checkbox-width);\n box-sizing: border-box;\n border-radius: var(--checkbox-border-radius);\n border: var(--checkbox-border-width) solid;\n background-color: var(--checkbox-background-default-default-light);\n color: var(--checkbox-color-default-default-light);\n border-color: var(--checkbox-border-color-default-default-light);\n transition: var(--checkbox-transition);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-light);\n color: var(--checkbox-color-default-hover-light);\n border-color: var(--checkbox-border-color-default-hover-light);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-light);\n color: var(--checkbox-color-default-active-light);\n border-color: var(--checkbox-border-color-default-active-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-light);\n color: var(--checkbox-color-checked-default-light);\n border-color: var(--checkbox-border-color-checked-default-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-light);\n color: var(--checkbox-color-checked-hover-light);\n border-color: var(--checkbox-border-color-checked-hover-light);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-light);\n color: var(--checkbox-color-checked-active-light);\n border-color: var(--checkbox-border-color-checked-active-light);\n }\n}\n.checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-light);\n cursor: not-allowed;\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n}\n.checkbox-input-icon {\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n padding: 1px;\n}\n.checkbox-label {\n padding: var(--checkbox-label-padding);\n line-height: var(--checkbox-line-height);\n}\ninput {\n margin: 0;\n opacity: 0;\n position: absolute;\n pointer-events: none;\n}\n[data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-light) !important;\n}\n\n[dark-mode=\"true\"] {\n .checkbox {\n .checkbox-input {\n background-color: var(--checkbox-background-default-default-dark);\n color: var(--checkbox-color-default-default-dark);\n border-color: var(--checkbox-border-color-default-default-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-dark);\n color: var(--checkbox-color-default-hover-dark);\n border-color: var(--checkbox-border-color-default-hover-dark);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-dark);\n color: var(--checkbox-color-default-active-dark);\n border-color: var(--checkbox-border-color-default-active-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-dark);\n color: var(--checkbox-color-checked-default-dark);\n border-color: var(--checkbox-border-color-checked-default-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-dark);\n color: var(--checkbox-color-checked-hover-dark);\n border-color: var(--checkbox-border-color-checked-hover-dark);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-dark);\n color: var(--checkbox-color-checked-active-dark);\n border-color: var(--checkbox-border-color-checked-active-dark);\n }\n }\n .checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-dark);\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n }\n\n [data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-dark) !important;\n }\n}\n</style>\n","<template>\n <div class=\"checkbox-skeleton\">\n <Skeleton\n width=\"var(--size-20)\"\n height=\"var(--size-20)\"\n radius=\"var(--border-radius-regular)\"\n :shimmer=\"shimmer\"\n />\n <Skeleton :width=\"labelWidth\" height=\"var(--size-16)\" :shimmer=\"shimmer\" />\n </div>\n</template>\n<script setup lang=\"ts\">\nimport type { PropType } from \"vue\";\nimport { Skeleton } from \"@gospore/skeleton\";\ntype SkeletonDimension = string | number;\ndefineOptions({ name: \"CheckboxSkeleton\" });\ndefineProps({\n /** Sets the placeholder width for the label line. Numbers are converted to px. */\n labelWidth: { type: [String, Number] as PropType<SkeletonDimension>, default: \"10rem\" },\n /** Enables the animated shimmer effect for the placeholder. */\n shimmer: { type: Boolean, default: false },\n});\n</script>\n<style scoped lang=\"less\">\n.checkbox-skeleton {\n display: inline-flex;\n align-items: center;\n gap: var(--size-8);\n}\n</style>\n","<template>\n <div class=\"checkbox-skeleton\">\n <Skeleton\n width=\"var(--size-20)\"\n height=\"var(--size-20)\"\n radius=\"var(--border-radius-regular)\"\n :shimmer=\"shimmer\"\n />\n <Skeleton :width=\"labelWidth\" height=\"var(--size-16)\" :shimmer=\"shimmer\" />\n </div>\n</template>\n<script setup lang=\"ts\">\nimport type { PropType } from \"vue\";\nimport { Skeleton } from \"@gospore/skeleton\";\ntype SkeletonDimension = string | number;\ndefineOptions({ name: \"CheckboxSkeleton\" });\ndefineProps({\n /** Sets the placeholder width for the label line. Numbers are converted to px. */\n labelWidth: { type: [String, Number] as PropType<SkeletonDimension>, default: \"10rem\" },\n /** Enables the animated shimmer effect for the placeholder. */\n shimmer: { type: Boolean, default: false },\n});\n</script>\n<style scoped lang=\"less\">\n.checkbox-skeleton {\n display: inline-flex;\n align-items: center;\n gap: var(--size-8);\n}\n</style>\n"],"mappings":"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"}
package/dist/checkbox.css CHANGED
@@ -1,2 +1,2 @@
1
- .theme{--checkbox-background-default-default-light:var(--color-background-input-light);--checkbox-background-default-default-dark:var(--color-background-input-dark);--checkbox-background-default-hover-light:var(--color-background-input-hovered-light);--checkbox-background-default-hover-dark:var(--color-background-input-hovered-dark);--checkbox-background-default-active-light:var(--color-background-brand-100-light);--checkbox-background-default-active-dark:var(--color-background-brand-100-dark);--checkbox-background-default-disabled-light:var(--color-background-disabled-light);--checkbox-background-default-disabled-dark:var(--color-background-disabled-dark);--checkbox-background-checked-default-light:var(--color-background-brand-200-light);--checkbox-background-checked-default-dark:var(--color-background-brand-200-dark);--checkbox-background-checked-hover-light:var(--color-background-brand-200-hovered-light);--checkbox-background-checked-hover-dark:var(--color-background-brand-200-hovered-dark);--checkbox-background-checked-active-light:var(--color-background-brand-200-pressed-light);--checkbox-background-checked-active-dark:var(--color-background-brand-200-pressed-dark);--checkbox-background-checked-disabled-light:var(--color-background-disabled-light);--checkbox-background-checked-disabled-dark:var(--color-background-disabled-dark);--checkbox-color-default-default-light:transparent;--checkbox-color-default-default-dark:transparent;--checkbox-color-default-hover-light:transparent;--checkbox-color-default-hover-dark:transparent;--checkbox-color-default-active-light:var(--color-text-brand-light);--checkbox-color-default-active-dark:var(--color-text-brand-dark);--checkbox-color-default-disabled-light:transparent;--checkbox-color-default-disabled-dark:transparent;--checkbox-color-checked-default-light:var(--color-brand-on-strong-light);--checkbox-color-checked-default-dark:var(--color-brand-on-strong-dark);--checkbox-color-checked-hover-light:var(--color-brand-on-strong-light);--checkbox-color-checked-hover-dark:var(--color-brand-on-strong-dark);--checkbox-color-checked-active-light:var(--color-background-brand-100-light);--checkbox-color-checked-active-dark:var(--color-background-brand-100-dark);--checkbox-color-checked-disabled-light:var(--color-text-disabled-light);--checkbox-color-checked-disabled-dark:var(--color-text-disabled-dark);--checkbox-border-color-default-default-light:var(--color-border-input-light);--checkbox-border-color-default-default-dark:var(--color-border-input-dark);--checkbox-border-color-default-hover-light:var(--color-border-input-light);--checkbox-border-color-default-hover-dark:var(--color-border-input-dark);--checkbox-border-color-default-active-light:var(--color-background-brand-100-pressed-light);--checkbox-border-color-default-active-dark:var(--color-background-brand-100-pressed-dark);--checkbox-border-color-default-disabled-light:var(--color-border-input-disabled-light);--checkbox-border-color-default-disabled-dark:var(--color-border-input-disabled-dark);--checkbox-border-color-checked-default-light:var(--color-background-brand-200-light);--checkbox-border-color-checked-default-dark:var(--color-background-brand-200-dark);--checkbox-border-color-checked-hover-light:var(--color-background-brand-200-hovered-light);--checkbox-border-color-checked-hover-dark:var(--color-background-brand-200-hovered-dark);--checkbox-border-color-checked-active-light:var(--color-background-brand-200-light);--checkbox-border-color-checked-active-dark:var(--color-background-brand-200-dark);--checkbox-border-color-checked-disabled-light:var(--color-border-input-disabled-light);--checkbox-border-color-checked-disabled-dark:var(--color-border-input-disabled-dark);--checkbox-height:14px;--checkbox-width:14px;--checkbox-padding:2px var(--size-0);--checkbox-line-height:var(--size-24);--checkbox-label-padding:var(--size-0) var(--size-4);--checkbox-border-radius:var(--border-radius-regular);--checkbox-border-width:var(--border-width);--checkbox-transition:all var(--transition-100ms-ease-in-out);--checkbox-focus-outline-color-light:var(--color-border-focused-light);--checkbox-focus-outline-color-dark:var(--color-border-focused-dark)}.checkbox[data-v-eb918898]{padding:var(--checkbox-padding);display:flex;position:relative}.checkbox .checkbox-input-container[data-v-eb918898]{padding:5px}.checkbox .checkbox-input[data-v-eb918898]{height:var(--checkbox-height);width:var(--checkbox-width);box-sizing:border-box;border-radius:var(--checkbox-border-radius);border:var(--checkbox-border-width) solid;background-color:var(--checkbox-background-default-default-light);color:var(--checkbox-color-default-default-light);border-color:var(--checkbox-border-color-default-default-light);transition:var(--checkbox-transition);justify-content:center;align-items:center;display:flex}.checkbox:hover .checkbox-input[data-v-eb918898]{background-color:var(--checkbox-background-default-hover-light);color:var(--checkbox-color-default-hover-light);border-color:var(--checkbox-border-color-default-hover-light)}.checkbox:active .checkbox-input[data-v-eb918898]{background-color:var(--checkbox-background-default-active-light);color:var(--checkbox-color-default-active-light);border-color:var(--checkbox-border-color-default-active-light)}.checkbox .checkbox-checked[data-v-eb918898]{background-color:var(--checkbox-background-checked-default-light);color:var(--checkbox-color-checked-default-light);border-color:var(--checkbox-border-color-checked-default-light)}.checkbox:hover .checkbox-checked[data-v-eb918898]{background-color:var(--checkbox-background-checked-hover-light);color:var(--checkbox-color-checked-hover-light);border-color:var(--checkbox-border-color-checked-hover-light)}.checkbox:active .checkbox-checked[data-v-eb918898]{background-color:var(--checkbox-background-checked-active-light);color:var(--checkbox-color-checked-active-light);border-color:var(--checkbox-border-color-checked-active-light)}.checkbox-disabled[data-v-eb918898]{color:var(--checkbox-color-checked-disabled-light);cursor:not-allowed}.checkbox-disabled .checkbox-input[data-v-eb918898],.checkbox-disabled:hover .checkbox-input[data-v-eb918898]{background-color:var(--checkbox-background-default-disabled-light);color:var(--checkbox-color-default-disabled-light);border-color:var(--checkbox-border-color-default-disabled-light)}.checkbox-disabled .checkbox-checked[data-v-eb918898],.checkbox-disabled:hover .checkbox-checked[data-v-eb918898]{background-color:var(--checkbox-background-checked-disabled-light);color:var(--checkbox-color-checked-disabled-light);border-color:var(--checkbox-border-color-checked-disabled-light)}.checkbox-input-icon[data-v-eb918898]{box-sizing:border-box;width:100%;height:100%;padding:1px}.checkbox-label[data-v-eb918898]{padding:var(--checkbox-label-padding);line-height:var(--checkbox-line-height)}input[data-v-eb918898]{opacity:0;pointer-events:none;margin:0;position:absolute}[data-whatinput=keyboard] .checkbox-focused[data-v-eb918898]{border-color:var(--checkbox-focus-outline-color-light)!important}[dark-mode=true] .checkbox .checkbox-input[data-v-eb918898]{background-color:var(--checkbox-background-default-default-dark);color:var(--checkbox-color-default-default-dark);border-color:var(--checkbox-border-color-default-default-dark)}[dark-mode=true] .checkbox:hover .checkbox-input[data-v-eb918898]{background-color:var(--checkbox-background-default-hover-dark);color:var(--checkbox-color-default-hover-dark);border-color:var(--checkbox-border-color-default-hover-dark)}[dark-mode=true] .checkbox:active .checkbox-input[data-v-eb918898]{background-color:var(--checkbox-background-default-active-dark);color:var(--checkbox-color-default-active-dark);border-color:var(--checkbox-border-color-default-active-dark)}[dark-mode=true] .checkbox .checkbox-checked[data-v-eb918898]{background-color:var(--checkbox-background-checked-default-dark);color:var(--checkbox-color-checked-default-dark);border-color:var(--checkbox-border-color-checked-default-dark)}[dark-mode=true] .checkbox:hover .checkbox-checked[data-v-eb918898]{background-color:var(--checkbox-background-checked-hover-dark);color:var(--checkbox-color-checked-hover-dark);border-color:var(--checkbox-border-color-checked-hover-dark)}[dark-mode=true] .checkbox:active .checkbox-checked[data-v-eb918898]{background-color:var(--checkbox-background-checked-active-dark);color:var(--checkbox-color-checked-active-dark);border-color:var(--checkbox-border-color-checked-active-dark)}[dark-mode=true] .checkbox-disabled[data-v-eb918898]{color:var(--checkbox-color-checked-disabled-dark)}[dark-mode=true] .checkbox-disabled .checkbox-input[data-v-eb918898],[dark-mode=true] .checkbox-disabled:hover .checkbox-input[data-v-eb918898]{background-color:var(--checkbox-background-default-disabled-dark);color:var(--checkbox-color-default-disabled-dark);border-color:var(--checkbox-border-color-default-disabled-dark)}[dark-mode=true] .checkbox-disabled .checkbox-checked[data-v-eb918898],[dark-mode=true] .checkbox-disabled:hover .checkbox-checked[data-v-eb918898]{background-color:var(--checkbox-background-checked-disabled-dark);color:var(--checkbox-color-checked-disabled-dark);border-color:var(--checkbox-border-color-checked-disabled-dark)}[dark-mode=true] [data-whatinput=keyboard] .checkbox-focused[data-v-eb918898]{border-color:var(--checkbox-focus-outline-color-dark)!important}.checkbox-skeleton[data-v-472ff734]{align-items:center;gap:var(--size-8);display:inline-flex}
1
+ .theme{--checkbox-background-default-default-light:var(--color-background-input-light);--checkbox-background-default-default-dark:var(--color-background-input-dark);--checkbox-background-default-hover-light:var(--color-background-input-hovered-light);--checkbox-background-default-hover-dark:var(--color-background-input-hovered-dark);--checkbox-background-default-active-light:var(--color-background-brand-100-light);--checkbox-background-default-active-dark:var(--color-background-brand-100-dark);--checkbox-background-default-disabled-light:var(--color-background-disabled-light);--checkbox-background-default-disabled-dark:var(--color-background-disabled-dark);--checkbox-background-checked-default-light:var(--color-background-brand-200-light);--checkbox-background-checked-default-dark:var(--color-background-brand-200-dark);--checkbox-background-checked-hover-light:var(--color-background-brand-200-hovered-light);--checkbox-background-checked-hover-dark:var(--color-background-brand-200-hovered-dark);--checkbox-background-checked-active-light:var(--color-background-brand-200-pressed-light);--checkbox-background-checked-active-dark:var(--color-background-brand-200-pressed-dark);--checkbox-background-checked-disabled-light:var(--color-background-disabled-light);--checkbox-background-checked-disabled-dark:var(--color-background-disabled-dark);--checkbox-color-default-default-light:transparent;--checkbox-color-default-default-dark:transparent;--checkbox-color-default-hover-light:transparent;--checkbox-color-default-hover-dark:transparent;--checkbox-color-default-active-light:var(--color-text-brand-light);--checkbox-color-default-active-dark:var(--color-text-brand-dark);--checkbox-color-default-disabled-light:transparent;--checkbox-color-default-disabled-dark:transparent;--checkbox-color-checked-default-light:var(--color-brand-on-strong-light);--checkbox-color-checked-default-dark:var(--color-brand-on-strong-dark);--checkbox-color-checked-hover-light:var(--color-brand-on-strong-light);--checkbox-color-checked-hover-dark:var(--color-brand-on-strong-dark);--checkbox-color-checked-active-light:var(--color-brand-on-strong-light);--checkbox-color-checked-active-dark:var(--color-brand-on-strong-dark);--checkbox-color-checked-disabled-light:var(--color-text-disabled-light);--checkbox-color-checked-disabled-dark:var(--color-text-disabled-dark);--checkbox-border-color-default-default-light:var(--color-border-input-light);--checkbox-border-color-default-default-dark:var(--color-border-input-dark);--checkbox-border-color-default-hover-light:var(--color-border-input-light);--checkbox-border-color-default-hover-dark:var(--color-border-input-dark);--checkbox-border-color-default-active-light:var(--color-background-brand-100-pressed-light);--checkbox-border-color-default-active-dark:var(--color-background-brand-100-pressed-dark);--checkbox-border-color-default-disabled-light:var(--color-border-input-disabled-light);--checkbox-border-color-default-disabled-dark:var(--color-border-input-disabled-dark);--checkbox-border-color-checked-default-light:var(--color-background-brand-200-light);--checkbox-border-color-checked-default-dark:var(--color-background-brand-200-dark);--checkbox-border-color-checked-hover-light:var(--color-background-brand-200-hovered-light);--checkbox-border-color-checked-hover-dark:var(--color-background-brand-200-hovered-dark);--checkbox-border-color-checked-active-light:var(--color-background-brand-200-light);--checkbox-border-color-checked-active-dark:var(--color-background-brand-200-dark);--checkbox-border-color-checked-disabled-light:var(--color-border-input-disabled-light);--checkbox-border-color-checked-disabled-dark:var(--color-border-input-disabled-dark);--checkbox-height:14px;--checkbox-width:14px;--checkbox-padding:2px var(--size-0);--checkbox-line-height:var(--size-24);--checkbox-label-padding:var(--size-0) var(--size-4);--checkbox-border-radius:var(--border-radius-regular);--checkbox-border-width:var(--border-width);--checkbox-transition:background-color var(--transition-100ms-ease-in-out), border-color var(--transition-100ms-ease-in-out), color var(--transition-100ms-ease-in-out);--checkbox-focus-outline-color-light:var(--color-border-focused-light);--checkbox-focus-outline-color-dark:var(--color-border-focused-dark)}.checkbox[data-v-2c346baa]{padding:var(--checkbox-padding);display:flex;position:relative}.checkbox .checkbox-input-container[data-v-2c346baa]{padding:5px}.checkbox .checkbox-input[data-v-2c346baa]{height:var(--checkbox-height);width:var(--checkbox-width);box-sizing:border-box;border-radius:var(--checkbox-border-radius);border:var(--checkbox-border-width) solid;background-color:var(--checkbox-background-default-default-light);color:var(--checkbox-color-default-default-light);border-color:var(--checkbox-border-color-default-default-light);transition:var(--checkbox-transition);justify-content:center;align-items:center;display:flex}.checkbox:hover .checkbox-input[data-v-2c346baa]{background-color:var(--checkbox-background-default-hover-light);color:var(--checkbox-color-default-hover-light);border-color:var(--checkbox-border-color-default-hover-light)}.checkbox:active .checkbox-input[data-v-2c346baa]{background-color:var(--checkbox-background-default-active-light);color:var(--checkbox-color-default-active-light);border-color:var(--checkbox-border-color-default-active-light)}.checkbox .checkbox-checked[data-v-2c346baa]{background-color:var(--checkbox-background-checked-default-light);color:var(--checkbox-color-checked-default-light);border-color:var(--checkbox-border-color-checked-default-light)}.checkbox:hover .checkbox-checked[data-v-2c346baa]{background-color:var(--checkbox-background-checked-hover-light);color:var(--checkbox-color-checked-hover-light);border-color:var(--checkbox-border-color-checked-hover-light)}.checkbox:active .checkbox-checked[data-v-2c346baa]{background-color:var(--checkbox-background-checked-active-light);color:var(--checkbox-color-checked-active-light);border-color:var(--checkbox-border-color-checked-active-light)}.checkbox-disabled[data-v-2c346baa]{color:var(--checkbox-color-checked-disabled-light);cursor:not-allowed}.checkbox-disabled .checkbox-input[data-v-2c346baa],.checkbox-disabled:hover .checkbox-input[data-v-2c346baa]{background-color:var(--checkbox-background-default-disabled-light);color:var(--checkbox-color-default-disabled-light);border-color:var(--checkbox-border-color-default-disabled-light)}.checkbox-disabled .checkbox-checked[data-v-2c346baa],.checkbox-disabled:hover .checkbox-checked[data-v-2c346baa]{background-color:var(--checkbox-background-checked-disabled-light);color:var(--checkbox-color-checked-disabled-light);border-color:var(--checkbox-border-color-checked-disabled-light)}.checkbox-input-icon[data-v-2c346baa]{box-sizing:border-box;width:100%;height:100%;padding:1px}.checkbox-label[data-v-2c346baa]{padding:var(--checkbox-label-padding);line-height:var(--checkbox-line-height)}input[data-v-2c346baa]{opacity:0;pointer-events:none;margin:0;position:absolute}[data-whatinput=keyboard] .checkbox-focused[data-v-2c346baa]{border-color:var(--checkbox-focus-outline-color-light)!important}[dark-mode=true] .checkbox .checkbox-input[data-v-2c346baa]{background-color:var(--checkbox-background-default-default-dark);color:var(--checkbox-color-default-default-dark);border-color:var(--checkbox-border-color-default-default-dark)}[dark-mode=true] .checkbox:hover .checkbox-input[data-v-2c346baa]{background-color:var(--checkbox-background-default-hover-dark);color:var(--checkbox-color-default-hover-dark);border-color:var(--checkbox-border-color-default-hover-dark)}[dark-mode=true] .checkbox:active .checkbox-input[data-v-2c346baa]{background-color:var(--checkbox-background-default-active-dark);color:var(--checkbox-color-default-active-dark);border-color:var(--checkbox-border-color-default-active-dark)}[dark-mode=true] .checkbox .checkbox-checked[data-v-2c346baa]{background-color:var(--checkbox-background-checked-default-dark);color:var(--checkbox-color-checked-default-dark);border-color:var(--checkbox-border-color-checked-default-dark)}[dark-mode=true] .checkbox:hover .checkbox-checked[data-v-2c346baa]{background-color:var(--checkbox-background-checked-hover-dark);color:var(--checkbox-color-checked-hover-dark);border-color:var(--checkbox-border-color-checked-hover-dark)}[dark-mode=true] .checkbox:active .checkbox-checked[data-v-2c346baa]{background-color:var(--checkbox-background-checked-active-dark);color:var(--checkbox-color-checked-active-dark);border-color:var(--checkbox-border-color-checked-active-dark)}[dark-mode=true] .checkbox-disabled[data-v-2c346baa]{color:var(--checkbox-color-checked-disabled-dark)}[dark-mode=true] .checkbox-disabled .checkbox-input[data-v-2c346baa],[dark-mode=true] .checkbox-disabled:hover .checkbox-input[data-v-2c346baa]{background-color:var(--checkbox-background-default-disabled-dark);color:var(--checkbox-color-default-disabled-dark);border-color:var(--checkbox-border-color-default-disabled-dark)}[dark-mode=true] .checkbox-disabled .checkbox-checked[data-v-2c346baa],[dark-mode=true] .checkbox-disabled:hover .checkbox-checked[data-v-2c346baa]{background-color:var(--checkbox-background-checked-disabled-dark);color:var(--checkbox-color-checked-disabled-dark);border-color:var(--checkbox-border-color-checked-disabled-dark)}[dark-mode=true] [data-whatinput=keyboard] .checkbox-focused[data-v-2c346baa]{border-color:var(--checkbox-focus-outline-color-dark)!important}.checkbox-skeleton[data-v-472ff734]{align-items:center;gap:var(--size-8);display:inline-flex}
2
2
  /*$vite$:1*/
@@ -1,21 +1,72 @@
1
- import { Comment as e, Fragment as t, Text as n, computed as r, createElementBlock as i, createElementVNode as a, createVNode as o, defineComponent as s, isVNode as c, mergeProps as l, normalizeClass as u, openBlock as d, ref as f, renderSlot as p, toDisplayString as m, unref as h, useAttrs as g, useSlots as _, vModelCheckbox as v, watch as y, withDirectives as b } from "vue";
2
- import { FontAwesomeIcon as x } from "@fortawesome/vue-fontawesome";
3
- import { faCheck as S } from "@fortawesome/free-solid-svg-icons";
4
- import C from "lodash/without.js";
5
- import { Skeleton as w } from "@gospore/skeleton";
6
- //#region ../shared/slot.ts
1
+ import { Comment as e, Fragment as t, Text as n, computed as r, createElementBlock as i, createElementVNode as a, createVNode as o, defineComponent as s, isVNode as c, mergeProps as l, normalizeClass as u, openBlock as d, ref as f, renderSlot as p, toDisplayString as m, unref as h, useAttrs as g, useSlots as _, watch as v } from "vue";
2
+ import { FontAwesomeIcon as y } from "@fortawesome/vue-fontawesome";
3
+ import { faCheck as b } from "@fortawesome/free-solid-svg-icons";
4
+ import x from "lodash/without.js";
5
+ import { Skeleton as S } from "@gospore/skeleton";
6
+ //#region ../../shared/slot.ts
7
+ function C(e) {
8
+ return e ? w(e()) : !1;
9
+ }
10
+ function w(e) {
11
+ return T(e);
12
+ }
7
13
  function T(e) {
8
- return e ? E(e()) : !1;
14
+ let n = /* @__PURE__ */ new WeakSet(), r = /* @__PURE__ */ new WeakSet(), i = [{
15
+ kind: "value",
16
+ value: e
17
+ }];
18
+ for (; i.length > 0;) {
19
+ let e = i.pop();
20
+ if (e.kind === "leave-array") {
21
+ n.delete(e.array);
22
+ continue;
23
+ }
24
+ let a = e.value;
25
+ if (Array.isArray(a)) {
26
+ E(i, a, n);
27
+ continue;
28
+ }
29
+ if (typeof a == "string") {
30
+ if (a.trim() !== "") return !0;
31
+ continue;
32
+ }
33
+ if (typeof a == "number") return !0;
34
+ if (!(!c(a) || !D(a))) {
35
+ if (a.type === t) {
36
+ if (r.has(a)) continue;
37
+ r.add(a), i.push({
38
+ kind: "value",
39
+ value: a.children
40
+ });
41
+ continue;
42
+ }
43
+ return !0;
44
+ }
45
+ }
46
+ return !1;
9
47
  }
10
- function E(e) {
11
- return Array.isArray(e) ? e.some(E) : typeof e == "string" ? e.trim() !== "" : typeof e == "number" ? !0 : !c(e) || !D(e) ? !1 : e.type === t ? E(e.children) : !0;
48
+ function E(e, t, n) {
49
+ if (!n.has(t)) {
50
+ n.add(t), e.push({
51
+ array: t,
52
+ kind: "leave-array"
53
+ });
54
+ for (let n = t.length - 1; n >= 0; --n) e.push({
55
+ kind: "value",
56
+ value: t[n]
57
+ });
58
+ }
12
59
  }
13
60
  function D(t) {
14
- return t.type === e ? !1 : t.type === n ? typeof t.children == "string" && t.children.trim() !== "" : !0;
61
+ return t.type === e ? !1 : t.type !== n || typeof t.children == "string" && t.children.trim() !== "";
15
62
  }
16
63
  //#endregion
17
64
  //#region src/Checkbox.vue?vue&type=script&setup=true&lang.ts
18
- var O = ["title"], k = { class: "checkbox-input-container" }, A = ["value", "disabled"], j = {
65
+ var O = ["title"], k = { class: "checkbox-input-container" }, A = [
66
+ "value",
67
+ "checked",
68
+ "disabled"
69
+ ], j = {
19
70
  key: 0,
20
71
  class: "checkbox-label"
21
72
  }, M = {
@@ -49,21 +100,29 @@ var O = ["title"], k = { class: "checkbox-input-container" }, A = ["value", "dis
49
100
  "click"
50
101
  ],
51
102
  setup(e, { emit: t }) {
52
- let n = e, s = t, c = g(), w = _(), E = f(!1), D = f(n.checked), N = r(() => T(w.default)), P = r(() => typeof D.value == "boolean" ? D.value : D.value.includes(n.value)), F = r(() => {
103
+ let n = e, s = t, c = g(), S = _(), w = f(!1), T = f(n.checked), E = r(() => C(S.default)), D = r(() => typeof T.value == "boolean" ? T.value : T.value.includes(n.value)), N = r(() => {
53
104
  let { class: e, ...t } = c;
54
105
  return Object.assign({}, t, {
55
106
  onClick(e) {
56
107
  n.disabled || s("click", e);
57
108
  },
58
109
  onKeyup(e) {
59
- s("keyup", e), !n.disabled && e.key === "Enter" && (s("click", e), typeof D.value == "boolean" ? D.value = !D.value : D.value.includes(n.value) ? D.value = C(D.value, n.value) : D.value = [...D.value, n.value]);
110
+ s("keyup", e), !n.disabled && e.key === "Enter" && (s("click", e), typeof T.value == "boolean" ? T.value = !T.value : T.value.includes(n.value) ? T.value = x(T.value, n.value) : T.value = [...T.value, n.value]);
60
111
  }
61
112
  });
62
113
  });
63
- return y(() => n.checked, (e) => {
64
- D.value = e;
65
- }), y(() => D.value, () => {
66
- D.value != n.checked && s("update:checked", D.value);
114
+ function P(e) {
115
+ let t = e.currentTarget.checked;
116
+ if (typeof T.value == "boolean") {
117
+ T.value = t;
118
+ return;
119
+ }
120
+ t && !T.value.includes(n.value) ? T.value = [...T.value, n.value] : !t && T.value.includes(n.value) && (T.value = x(T.value, n.value));
121
+ }
122
+ return v(() => n.checked, (e) => {
123
+ T.value = e;
124
+ }), v(() => T.value, () => {
125
+ T.value != n.checked && s("update:checked", T.value);
67
126
  }), (t, n) => (d(), i("label", {
68
127
  class: u([
69
128
  "checkbox",
@@ -71,27 +130,28 @@ var O = ["title"], k = { class: "checkbox-input-container" }, A = ["value", "dis
71
130
  h(c).class
72
131
  ]),
73
132
  title: h(c).title
74
- }, [a("div", k, [a("span", { class: u(["checkbox-input", {
75
- "checkbox-checked": P.value,
76
- "checkbox-focused": E.value
77
- }]) }, [o(h(x), {
133
+ }, [a("span", k, [a("span", { class: u(["checkbox-input", {
134
+ "checkbox-checked": D.value,
135
+ "checkbox-focused": w.value
136
+ }]) }, [o(h(y), {
78
137
  class: "checkbox-input-icon",
79
- icon: h(S),
138
+ icon: h(b),
80
139
  "aria-hidden": "true"
81
- }, null, 8, ["icon"]), b(a("input", l(F.value, {
82
- "onUpdate:modelValue": n[0] ||= (e) => D.value = e,
140
+ }, null, 8, ["icon"]), a("input", l(N.value, {
83
141
  type: "checkbox",
84
142
  value: e.value,
143
+ checked: D.value,
85
144
  disabled: e.disabled,
86
- onFocus: n[1] ||= (e) => E.value = !0,
87
- onFocusout: n[2] ||= (e) => E.value = !1
88
- }), null, 16, A), [[v, D.value]])], 2)]), N.value ? (d(), i("div", j, [p(t.$slots, "default", {}, void 0, !0)])) : (d(), i("span", M, m(e.label), 1))], 10, O));
145
+ onChange: P,
146
+ onFocus: n[0] ||= (e) => w.value = !0,
147
+ onFocusout: n[1] ||= (e) => w.value = !1
148
+ }), null, 16, A)], 2)]), E.value ? (d(), i("span", j, [p(t.$slots, "default", {}, void 0, !0)])) : (d(), i("span", M, m(e.label), 1))], 10, O));
89
149
  }
90
150
  }), P = (e, t) => {
91
151
  let n = e.__vccOpts || e;
92
152
  for (let [e, r] of t) n[e] = r;
93
153
  return n;
94
- }, F = /*#__PURE__*/ P(N, [["__scopeId", "data-v-eb918898"]]), I = { class: "checkbox-skeleton" }, L = /*#__PURE__*/ P(/* @__PURE__ */ s({
154
+ }, F = /*#__PURE__*/ P(N, [["__scopeId", "data-v-2c346baa"]]), I = { class: "checkbox-skeleton" }, L = /*#__PURE__*/ P(/* @__PURE__ */ s({
95
155
  name: "CheckboxSkeleton",
96
156
  __name: "CheckboxSkeleton",
97
157
  props: {
@@ -105,12 +165,12 @@ var O = ["title"], k = { class: "checkbox-input-container" }, A = ["value", "dis
105
165
  }
106
166
  },
107
167
  setup(e) {
108
- return (t, n) => (d(), i("div", I, [o(h(w), {
168
+ return (t, n) => (d(), i("div", I, [o(h(S), {
109
169
  width: "var(--size-20)",
110
170
  height: "var(--size-20)",
111
171
  radius: "var(--border-radius-regular)",
112
172
  shimmer: e.shimmer
113
- }, null, 8, ["shimmer"]), o(h(w), {
173
+ }, null, 8, ["shimmer"]), o(h(S), {
114
174
  width: e.labelWidth,
115
175
  height: "var(--size-16)",
116
176
  shimmer: e.shimmer
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox.es.js","names":[],"sources":["../../shared/slot.ts","../src/Checkbox.vue","../src/Checkbox.vue","../src/CheckboxSkeleton.vue","../src/CheckboxSkeleton.vue"],"sourcesContent":["import { Comment, Fragment, isVNode, Text } from \"vue\";\nimport type { VNode, VNodeArrayChildren } from \"vue\";\n\ntype SlotFunction = () => unknown;\n\nexport function collectRenderableVNodes(children: VNodeArrayChildren | VNode[]): VNode[] {\n const nodes: VNode[] = [];\n\n children.forEach((child) => {\n if (Array.isArray(child)) {\n nodes.push(...collectRenderableVNodes(child));\n return;\n }\n if (!isVNode(child) || !isRenderableVNode(child)) {\n return;\n }\n if (child.type === Fragment && Array.isArray(child.children)) {\n nodes.push(...collectRenderableVNodes(child.children));\n return;\n }\n nodes.push(child);\n });\n\n return nodes;\n}\n\nexport function hasRenderableSlotContent(slot?: SlotFunction): boolean {\n if (!slot) {\n return false;\n }\n\n return isRenderableSlotChild(slot());\n}\n\nexport function collectSlotText(children: VNodeArrayChildren): string {\n return children\n .map((child) => {\n if (Array.isArray(child)) {\n return collectSlotText(child);\n }\n if (typeof child === \"string\" || typeof child === \"number\") {\n return String(child);\n }\n if (!isVNode(child) || child.type === Comment) {\n return \"\";\n }\n if (typeof child.children === \"string\") {\n return child.children;\n }\n if (Array.isArray(child.children)) {\n return collectSlotText(child.children);\n }\n return \"\";\n })\n .join(\"\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction isRenderableSlotChild(child: unknown): boolean {\n if (Array.isArray(child)) {\n return child.some(isRenderableSlotChild);\n }\n if (typeof child === \"string\") {\n return child.trim() !== \"\";\n }\n if (typeof child === \"number\") {\n return true;\n }\n if (!isVNode(child) || !isRenderableVNode(child)) {\n return false;\n }\n if (child.type === Fragment) {\n return isRenderableSlotChild(child.children);\n }\n return true;\n}\n\nfunction isRenderableVNode(node: VNode): boolean {\n if (node.type === Comment) {\n return false;\n }\n if (node.type === Text) {\n return typeof node.children === \"string\" && node.children.trim() !== \"\";\n }\n return true;\n}\n","<template>\n <label\n :class=\"['checkbox', { 'checkbox-disabled': disabled }, defaultAttrs.class]\"\n :title=\"defaultAttrs.title\"\n >\n <div class=\"checkbox-input-container\">\n <span\n :class=\"[\n 'checkbox-input',\n {\n 'checkbox-checked': isChecked,\n 'checkbox-focused': focused,\n },\n ]\"\n >\n <font-awesome-icon class=\"checkbox-input-icon\" :icon=\"faCheck\" aria-hidden=\"true\" />\n <input\n v-bind=\"attrs\"\n v-model=\"internalChecked\"\n type=\"checkbox\"\n :value=\"value\"\n :disabled=\"disabled\"\n @focus=\"focused = true\"\n @focusout=\"focused = false\"\n />\n </span>\n </div>\n <div v-if=\"hasDefaultContent\" class=\"checkbox-label\">\n <slot />\n </div>\n <span v-else class=\"checkbox-label\">{{ label }}</span>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { useAttrs, ref, computed, watch } from \"vue\";\nimport type { PropType } from \"vue\";\nimport { FontAwesomeIcon } from \"@fortawesome/vue-fontawesome\";\nimport { faCheck } from \"@fortawesome/free-solid-svg-icons\";\nimport without from \"lodash/without.js\";\nimport { hasRenderableSlotContent } from \"../../shared/slot\";\n\ntype CheckboxValue = string | Record<string, unknown>;\ntype CheckboxChecked = boolean | CheckboxValue[];\n\ndefineOptions({\n name: \"Checkbox\",\n inheritAttrs: false,\n});\nconst props = defineProps({\n /**\n * Controlled state. Pass a boolean for single checkboxes or an array for checkbox groups (the\n * component will push/pop value). Supports v-model:checked.\n */\n checked: {\n type: [Boolean, Array] as PropType<CheckboxChecked>,\n default: false,\n },\n /**\n * The value inserted or removed from the bound array when used in group mode. Ignored for\n * boolean usage.\n */\n value: {\n type: [String, Object] as PropType<CheckboxValue>,\n default: \"\",\n },\n /** Fallback label text when no default slot is provided. */\n label: {\n type: String,\n default: \"\",\n },\n /** Greys out the checkbox and prevents user interaction. */\n disabled: {\n type: Boolean,\n default: false,\n },\n});\nconst emit = defineEmits([\"update:checked\", \"keyup\", \"click\"]);\nconst defaultAttrs = useAttrs() as Record<string, unknown> & {\n class?: unknown;\n title?: string;\n};\nconst slots = defineSlots<{\n /** Custom label content rendered next to the checkbox input. */\n default?: () => unknown;\n}>();\nconst focused = ref(false);\nconst internalChecked = ref<CheckboxChecked>(props.checked);\nconst hasDefaultContent = computed(() => hasRenderableSlotContent(slots.default));\n\nconst isChecked = computed(() => {\n if (typeof internalChecked.value === \"boolean\") {\n return internalChecked.value;\n } else {\n return internalChecked.value.includes(props.value);\n }\n});\nconst attrs = computed(() => {\n const { class: omittedClass, ...inputAttrs } = defaultAttrs;\n void omittedClass;\n return Object.assign({}, inputAttrs, {\n onClick(event: MouseEvent) {\n if (!props.disabled) {\n emit(\"click\", event);\n }\n },\n // Pressing the enter key gets handled like a click.\n onKeyup(event: KeyboardEvent) {\n emit(\"keyup\", event);\n if (props.disabled) {\n return;\n }\n if (event.key === \"Enter\") {\n emit(\"click\", event);\n if (typeof internalChecked.value == \"boolean\") {\n internalChecked.value = !internalChecked.value;\n } else {\n if (internalChecked.value.includes(props.value)) {\n internalChecked.value = without(internalChecked.value, props.value);\n } else {\n internalChecked.value = [...internalChecked.value, props.value];\n }\n }\n }\n },\n });\n});\n\nwatch(\n () => props.checked,\n (checked) => {\n internalChecked.value = checked;\n },\n);\nwatch(\n () => internalChecked.value,\n () => {\n // Only emit the update:checked event if the mutation came from within the checkbox component.\n if (internalChecked.value != props.checked) {\n emit(\"update:checked\", internalChecked.value);\n }\n },\n);\n</script>\n\n<style>\n@import \"theme.css\";\n</style>\n\n<style lang=\"less\" scoped>\n.checkbox {\n position: relative;\n display: flex;\n padding: var(--checkbox-padding);\n\n .checkbox-input-container {\n padding: 5px;\n }\n .checkbox-input {\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--checkbox-height);\n width: var(--checkbox-width);\n box-sizing: border-box;\n border-radius: var(--checkbox-border-radius);\n border: var(--checkbox-border-width) solid;\n background-color: var(--checkbox-background-default-default-light);\n color: var(--checkbox-color-default-default-light);\n border-color: var(--checkbox-border-color-default-default-light);\n transition: var(--checkbox-transition);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-light);\n color: var(--checkbox-color-default-hover-light);\n border-color: var(--checkbox-border-color-default-hover-light);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-light);\n color: var(--checkbox-color-default-active-light);\n border-color: var(--checkbox-border-color-default-active-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-light);\n color: var(--checkbox-color-checked-default-light);\n border-color: var(--checkbox-border-color-checked-default-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-light);\n color: var(--checkbox-color-checked-hover-light);\n border-color: var(--checkbox-border-color-checked-hover-light);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-light);\n color: var(--checkbox-color-checked-active-light);\n border-color: var(--checkbox-border-color-checked-active-light);\n }\n}\n.checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-light);\n cursor: not-allowed;\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n}\n.checkbox-input-icon {\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n padding: 1px;\n}\n.checkbox-label {\n padding: var(--checkbox-label-padding);\n line-height: var(--checkbox-line-height);\n}\ninput {\n margin: 0;\n opacity: 0;\n position: absolute;\n pointer-events: none;\n}\n[data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-light) !important;\n}\n\n[dark-mode=\"true\"] {\n .checkbox {\n .checkbox-input {\n background-color: var(--checkbox-background-default-default-dark);\n color: var(--checkbox-color-default-default-dark);\n border-color: var(--checkbox-border-color-default-default-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-dark);\n color: var(--checkbox-color-default-hover-dark);\n border-color: var(--checkbox-border-color-default-hover-dark);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-dark);\n color: var(--checkbox-color-default-active-dark);\n border-color: var(--checkbox-border-color-default-active-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-dark);\n color: var(--checkbox-color-checked-default-dark);\n border-color: var(--checkbox-border-color-checked-default-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-dark);\n color: var(--checkbox-color-checked-hover-dark);\n border-color: var(--checkbox-border-color-checked-hover-dark);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-dark);\n color: var(--checkbox-color-checked-active-dark);\n border-color: var(--checkbox-border-color-checked-active-dark);\n }\n }\n .checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-dark);\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n }\n\n [data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-dark) !important;\n }\n}\n</style>\n","<template>\n <label\n :class=\"['checkbox', { 'checkbox-disabled': disabled }, defaultAttrs.class]\"\n :title=\"defaultAttrs.title\"\n >\n <div class=\"checkbox-input-container\">\n <span\n :class=\"[\n 'checkbox-input',\n {\n 'checkbox-checked': isChecked,\n 'checkbox-focused': focused,\n },\n ]\"\n >\n <font-awesome-icon class=\"checkbox-input-icon\" :icon=\"faCheck\" aria-hidden=\"true\" />\n <input\n v-bind=\"attrs\"\n v-model=\"internalChecked\"\n type=\"checkbox\"\n :value=\"value\"\n :disabled=\"disabled\"\n @focus=\"focused = true\"\n @focusout=\"focused = false\"\n />\n </span>\n </div>\n <div v-if=\"hasDefaultContent\" class=\"checkbox-label\">\n <slot />\n </div>\n <span v-else class=\"checkbox-label\">{{ label }}</span>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { useAttrs, ref, computed, watch } from \"vue\";\nimport type { PropType } from \"vue\";\nimport { FontAwesomeIcon } from \"@fortawesome/vue-fontawesome\";\nimport { faCheck } from \"@fortawesome/free-solid-svg-icons\";\nimport without from \"lodash/without.js\";\nimport { hasRenderableSlotContent } from \"../../shared/slot\";\n\ntype CheckboxValue = string | Record<string, unknown>;\ntype CheckboxChecked = boolean | CheckboxValue[];\n\ndefineOptions({\n name: \"Checkbox\",\n inheritAttrs: false,\n});\nconst props = defineProps({\n /**\n * Controlled state. Pass a boolean for single checkboxes or an array for checkbox groups (the\n * component will push/pop value). Supports v-model:checked.\n */\n checked: {\n type: [Boolean, Array] as PropType<CheckboxChecked>,\n default: false,\n },\n /**\n * The value inserted or removed from the bound array when used in group mode. Ignored for\n * boolean usage.\n */\n value: {\n type: [String, Object] as PropType<CheckboxValue>,\n default: \"\",\n },\n /** Fallback label text when no default slot is provided. */\n label: {\n type: String,\n default: \"\",\n },\n /** Greys out the checkbox and prevents user interaction. */\n disabled: {\n type: Boolean,\n default: false,\n },\n});\nconst emit = defineEmits<{\n \"update:checked\": [value: CheckboxChecked];\n keyup: [event: KeyboardEvent];\n click: [event: MouseEvent | KeyboardEvent];\n}>();\nconst defaultAttrs = useAttrs() as Record<string, unknown> & {\n class?: unknown;\n title?: string;\n};\nconst slots = defineSlots<{\n /** Custom label content rendered next to the checkbox input. */\n default?: () => unknown;\n}>();\nconst focused = ref(false);\nconst internalChecked = ref<CheckboxChecked>(props.checked);\nconst hasDefaultContent = computed(() => hasRenderableSlotContent(slots.default));\n\nconst isChecked = computed(() => {\n if (typeof internalChecked.value === \"boolean\") {\n return internalChecked.value;\n } else {\n return internalChecked.value.includes(props.value);\n }\n});\nconst attrs = computed(() => {\n const { class: omittedClass, ...inputAttrs } = defaultAttrs;\n void omittedClass;\n return Object.assign({}, inputAttrs, {\n onClick(event: MouseEvent) {\n if (!props.disabled) {\n emit(\"click\", event);\n }\n },\n // Pressing the enter key gets handled like a click.\n onKeyup(event: KeyboardEvent) {\n emit(\"keyup\", event);\n if (props.disabled) {\n return;\n }\n if (event.key === \"Enter\") {\n emit(\"click\", event);\n if (typeof internalChecked.value == \"boolean\") {\n internalChecked.value = !internalChecked.value;\n } else {\n if (internalChecked.value.includes(props.value)) {\n internalChecked.value = without(internalChecked.value, props.value);\n } else {\n internalChecked.value = [...internalChecked.value, props.value];\n }\n }\n }\n },\n });\n});\n\nwatch(\n () => props.checked,\n (checked) => {\n internalChecked.value = checked;\n },\n);\nwatch(\n () => internalChecked.value,\n () => {\n // Only emit the update:checked event if the mutation came from within the checkbox component.\n if (internalChecked.value != props.checked) {\n emit(\"update:checked\", internalChecked.value);\n }\n },\n);\n</script>\n\n<style>\n@import \"theme.css\";\n</style>\n\n<style lang=\"less\" scoped>\n.checkbox {\n position: relative;\n display: flex;\n padding: var(--checkbox-padding);\n\n .checkbox-input-container {\n padding: 5px;\n }\n .checkbox-input {\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--checkbox-height);\n width: var(--checkbox-width);\n box-sizing: border-box;\n border-radius: var(--checkbox-border-radius);\n border: var(--checkbox-border-width) solid;\n background-color: var(--checkbox-background-default-default-light);\n color: var(--checkbox-color-default-default-light);\n border-color: var(--checkbox-border-color-default-default-light);\n transition: var(--checkbox-transition);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-light);\n color: var(--checkbox-color-default-hover-light);\n border-color: var(--checkbox-border-color-default-hover-light);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-light);\n color: var(--checkbox-color-default-active-light);\n border-color: var(--checkbox-border-color-default-active-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-light);\n color: var(--checkbox-color-checked-default-light);\n border-color: var(--checkbox-border-color-checked-default-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-light);\n color: var(--checkbox-color-checked-hover-light);\n border-color: var(--checkbox-border-color-checked-hover-light);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-light);\n color: var(--checkbox-color-checked-active-light);\n border-color: var(--checkbox-border-color-checked-active-light);\n }\n}\n.checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-light);\n cursor: not-allowed;\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n}\n.checkbox-input-icon {\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n padding: 1px;\n}\n.checkbox-label {\n padding: var(--checkbox-label-padding);\n line-height: var(--checkbox-line-height);\n}\ninput {\n margin: 0;\n opacity: 0;\n position: absolute;\n pointer-events: none;\n}\n[data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-light) !important;\n}\n\n[dark-mode=\"true\"] {\n .checkbox {\n .checkbox-input {\n background-color: var(--checkbox-background-default-default-dark);\n color: var(--checkbox-color-default-default-dark);\n border-color: var(--checkbox-border-color-default-default-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-dark);\n color: var(--checkbox-color-default-hover-dark);\n border-color: var(--checkbox-border-color-default-hover-dark);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-dark);\n color: var(--checkbox-color-default-active-dark);\n border-color: var(--checkbox-border-color-default-active-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-dark);\n color: var(--checkbox-color-checked-default-dark);\n border-color: var(--checkbox-border-color-checked-default-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-dark);\n color: var(--checkbox-color-checked-hover-dark);\n border-color: var(--checkbox-border-color-checked-hover-dark);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-dark);\n color: var(--checkbox-color-checked-active-dark);\n border-color: var(--checkbox-border-color-checked-active-dark);\n }\n }\n .checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-dark);\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n }\n\n [data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-dark) !important;\n }\n}\n</style>\n","<template>\n <div class=\"checkbox-skeleton\">\n <Skeleton\n width=\"var(--size-20)\"\n height=\"var(--size-20)\"\n radius=\"var(--border-radius-regular)\"\n :shimmer=\"shimmer\"\n />\n <Skeleton :width=\"labelWidth\" height=\"var(--size-16)\" :shimmer=\"shimmer\" />\n </div>\n</template>\n<script setup lang=\"ts\">\nimport type { PropType } from \"vue\";\nimport { Skeleton } from \"@gospore/skeleton\";\ntype SkeletonDimension = string | number;\ndefineOptions({ name: \"CheckboxSkeleton\" });\ndefineProps({\n /** Sets the placeholder width for the label line. Numbers are converted to px. */\n labelWidth: { type: [String, Number] as PropType<SkeletonDimension>, default: \"10rem\" },\n /** Enables the animated shimmer effect for the placeholder. */\n shimmer: { type: Boolean, default: false },\n});\n</script>\n<style scoped lang=\"less\">\n.checkbox-skeleton {\n display: inline-flex;\n align-items: center;\n gap: var(--size-8);\n}\n</style>\n","<template>\n <div class=\"checkbox-skeleton\">\n <Skeleton\n width=\"var(--size-20)\"\n height=\"var(--size-20)\"\n radius=\"var(--border-radius-regular)\"\n :shimmer=\"shimmer\"\n />\n <Skeleton :width=\"labelWidth\" height=\"var(--size-16)\" :shimmer=\"shimmer\" />\n </div>\n</template>\n<script setup lang=\"ts\">\nimport type { PropType } from \"vue\";\nimport { Skeleton } from \"@gospore/skeleton\";\ntype SkeletonDimension = string | number;\ndefineOptions({ name: \"CheckboxSkeleton\" });\ndefineProps({\n /** Sets the placeholder width for the label line. Numbers are converted to px. */\n labelWidth: { type: [String, Number] as PropType<SkeletonDimension>, default: \"10rem\" },\n /** Enables the animated shimmer effect for the placeholder. */\n shimmer: { type: Boolean, default: false },\n});\n</script>\n<style scoped lang=\"less\">\n.checkbox-skeleton {\n display: inline-flex;\n align-items: center;\n gap: var(--size-8);\n}\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"checkbox.es.js","names":[],"sources":["../../../shared/slot.ts","../src/Checkbox.vue","../src/Checkbox.vue","../src/CheckboxSkeleton.vue","../src/CheckboxSkeleton.vue"],"sourcesContent":["import { Comment, Fragment, isVNode, Text } from \"vue\";\nimport type { VNode, VNodeArrayChildren } from \"vue\";\n\ntype SlotFunction = () => unknown;\n\ntype TraversalEntry = { kind: \"value\"; value: unknown } | { array: unknown[]; kind: \"leave-array\" };\n\nexport function collectRenderableVNodes(children: VNodeArrayChildren | VNode[]): VNode[] {\n const nodes: VNode[] = [];\n const activeArrays = new WeakSet<unknown[]>();\n const stack: TraversalEntry[] = [];\n pushArray(stack, children as unknown[], activeArrays);\n\n while (stack.length > 0) {\n const entry = stack.pop()!;\n if (entry.kind === \"leave-array\") {\n activeArrays.delete(entry.array);\n continue;\n }\n\n const child = entry.value;\n if (Array.isArray(child)) {\n pushArray(stack, child, activeArrays);\n continue;\n }\n if (!isVNode(child) || !isRenderableVNode(child)) {\n continue;\n }\n if (child.type === Fragment && Array.isArray(child.children)) {\n pushArray(stack, child.children, activeArrays);\n continue;\n }\n nodes.push(child);\n }\n\n return nodes;\n}\n\nexport function hasRenderableSlotContent(slot?: SlotFunction): boolean {\n if (!slot) {\n return false;\n }\n\n return hasRenderableVNodeContent(slot());\n}\n\nexport function hasRenderableVNodeContent(children: unknown): boolean {\n return isRenderableSlotChild(children);\n}\n\nexport function collectSlotText(children: VNodeArrayChildren): string {\n const chunks: string[] = [];\n const activeArrays = new WeakSet<unknown[]>();\n const stack: TraversalEntry[] = [];\n pushArray(stack, children as unknown[], activeArrays);\n\n while (stack.length > 0) {\n const entry = stack.pop()!;\n if (entry.kind === \"leave-array\") {\n activeArrays.delete(entry.array);\n continue;\n }\n\n const child = entry.value;\n if (Array.isArray(child)) {\n pushArray(stack, child, activeArrays);\n continue;\n }\n if (typeof child === \"string\" || typeof child === \"number\") {\n chunks.push(String(child));\n continue;\n }\n if (!isVNode(child) || child.type === Comment) {\n continue;\n }\n if (typeof child.children === \"string\") {\n chunks.push(child.children);\n continue;\n }\n if (Array.isArray(child.children)) {\n pushArray(stack, child.children, activeArrays);\n }\n }\n\n return chunks.join(\"\").replace(/\\s+/g, \" \").trim();\n}\n\nfunction isRenderableSlotChild(child: unknown): boolean {\n const activeArrays = new WeakSet<unknown[]>();\n const visitedFragments = new WeakSet<VNode>();\n const stack: TraversalEntry[] = [{ kind: \"value\", value: child }];\n\n while (stack.length > 0) {\n const entry = stack.pop()!;\n if (entry.kind === \"leave-array\") {\n activeArrays.delete(entry.array);\n continue;\n }\n\n const current = entry.value;\n if (Array.isArray(current)) {\n pushArray(stack, current, activeArrays);\n continue;\n }\n if (typeof current === \"string\") {\n if (current.trim() !== \"\") {\n return true;\n }\n continue;\n }\n if (typeof current === \"number\") {\n return true;\n }\n if (!isVNode(current) || !isRenderableVNode(current)) {\n continue;\n }\n if (current.type === Fragment) {\n if (visitedFragments.has(current)) {\n continue;\n }\n visitedFragments.add(current);\n stack.push({ kind: \"value\", value: current.children });\n continue;\n }\n return true;\n }\n\n return false;\n}\n\nfunction pushArray(stack: TraversalEntry[], array: unknown[], activeArrays: WeakSet<unknown[]>) {\n if (activeArrays.has(array)) {\n return;\n }\n\n activeArrays.add(array);\n stack.push({ array, kind: \"leave-array\" });\n for (let index = array.length - 1; index >= 0; index -= 1) {\n stack.push({ kind: \"value\", value: array[index] });\n }\n}\n\nfunction isRenderableVNode(node: VNode): boolean {\n if (node.type === Comment) {\n return false;\n }\n if (node.type === Text) {\n return typeof node.children === \"string\" && node.children.trim() !== \"\";\n }\n return true;\n}\n","<template>\n <label\n :class=\"['checkbox', { 'checkbox-disabled': disabled }, defaultAttrs.class]\"\n :title=\"defaultAttrs.title\"\n >\n <span class=\"checkbox-input-container\">\n <span\n :class=\"[\n 'checkbox-input',\n {\n 'checkbox-checked': isChecked,\n 'checkbox-focused': focused,\n },\n ]\"\n >\n <font-awesome-icon class=\"checkbox-input-icon\" :icon=\"faCheck\" aria-hidden=\"true\" />\n <input\n v-bind=\"attrs\"\n type=\"checkbox\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n @change=\"handleChange\"\n @focus=\"focused = true\"\n @focusout=\"focused = false\"\n />\n </span>\n </span>\n <span v-if=\"hasDefaultContent\" class=\"checkbox-label\">\n <slot />\n </span>\n <span v-else class=\"checkbox-label\">{{ label }}</span>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { useAttrs, ref, computed, watch } from \"vue\";\nimport type { PropType } from \"vue\";\nimport { FontAwesomeIcon } from \"@fortawesome/vue-fontawesome\";\nimport { faCheck } from \"@fortawesome/free-solid-svg-icons\";\nimport without from \"lodash/without.js\";\nimport { hasRenderableSlotContent } from \"../../../shared/slot\";\n\ntype CheckboxValue = string | Record<string, unknown>;\ntype CheckboxChecked = boolean | CheckboxValue[];\n\ndefineOptions({\n name: \"Checkbox\",\n inheritAttrs: false,\n});\nconst props = defineProps({\n /**\n * Controlled state. Pass a boolean for single checkboxes or an array for checkbox groups (the\n * component will push/pop value). Supports v-model:checked.\n */\n checked: {\n type: [Boolean, Array] as PropType<CheckboxChecked>,\n default: false,\n },\n /**\n * The value inserted or removed from the bound array when used in group mode. Ignored for\n * boolean usage.\n */\n value: {\n type: [String, Object] as PropType<CheckboxValue>,\n default: \"\",\n },\n /** Fallback label text when no default slot is provided. */\n label: {\n type: String,\n default: \"\",\n },\n /** Greys out the checkbox and prevents user interaction. */\n disabled: {\n type: Boolean,\n default: false,\n },\n});\nconst emit = defineEmits([\"update:checked\", \"keyup\", \"click\"]);\nconst defaultAttrs = useAttrs() as Record<string, unknown> & {\n class?: unknown;\n title?: string;\n};\nconst slots = defineSlots<{\n /** Custom label content rendered next to the checkbox input. */\n default?: () => unknown;\n}>();\nconst focused = ref(false);\nconst internalChecked = ref<CheckboxChecked>(props.checked);\nconst hasDefaultContent = computed(() => hasRenderableSlotContent(slots.default));\n\nconst isChecked = computed(() => {\n if (typeof internalChecked.value === \"boolean\") {\n return internalChecked.value;\n } else {\n return internalChecked.value.includes(props.value);\n }\n});\nconst attrs = computed(() => {\n const { class: omittedClass, ...inputAttrs } = defaultAttrs;\n void omittedClass;\n return Object.assign({}, inputAttrs, {\n onClick(event: MouseEvent) {\n if (!props.disabled) {\n emit(\"click\", event);\n }\n },\n // Pressing the enter key gets handled like a click.\n onKeyup(event: KeyboardEvent) {\n emit(\"keyup\", event);\n if (props.disabled) {\n return;\n }\n if (event.key === \"Enter\") {\n emit(\"click\", event);\n if (typeof internalChecked.value == \"boolean\") {\n internalChecked.value = !internalChecked.value;\n } else {\n if (internalChecked.value.includes(props.value)) {\n internalChecked.value = without(internalChecked.value, props.value);\n } else {\n internalChecked.value = [...internalChecked.value, props.value];\n }\n }\n }\n },\n });\n});\n\nfunction handleChange(event: Event) {\n const checked = (event.currentTarget as HTMLInputElement).checked;\n\n if (typeof internalChecked.value === \"boolean\") {\n internalChecked.value = checked;\n return;\n }\n\n if (checked && !internalChecked.value.includes(props.value)) {\n internalChecked.value = [...internalChecked.value, props.value];\n } else if (!checked && internalChecked.value.includes(props.value)) {\n internalChecked.value = without(internalChecked.value, props.value);\n }\n}\n\nwatch(\n () => props.checked,\n (checked) => {\n internalChecked.value = checked;\n },\n);\nwatch(\n () => internalChecked.value,\n () => {\n // Only emit the update:checked event if the mutation came from within the checkbox component.\n if (internalChecked.value != props.checked) {\n emit(\"update:checked\", internalChecked.value);\n }\n },\n);\n</script>\n\n<style>\n@import \"theme.css\";\n</style>\n\n<style lang=\"less\" scoped>\n.checkbox {\n position: relative;\n display: flex;\n padding: var(--checkbox-padding);\n\n .checkbox-input-container {\n padding: 5px;\n }\n .checkbox-input {\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--checkbox-height);\n width: var(--checkbox-width);\n box-sizing: border-box;\n border-radius: var(--checkbox-border-radius);\n border: var(--checkbox-border-width) solid;\n background-color: var(--checkbox-background-default-default-light);\n color: var(--checkbox-color-default-default-light);\n border-color: var(--checkbox-border-color-default-default-light);\n transition: var(--checkbox-transition);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-light);\n color: var(--checkbox-color-default-hover-light);\n border-color: var(--checkbox-border-color-default-hover-light);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-light);\n color: var(--checkbox-color-default-active-light);\n border-color: var(--checkbox-border-color-default-active-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-light);\n color: var(--checkbox-color-checked-default-light);\n border-color: var(--checkbox-border-color-checked-default-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-light);\n color: var(--checkbox-color-checked-hover-light);\n border-color: var(--checkbox-border-color-checked-hover-light);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-light);\n color: var(--checkbox-color-checked-active-light);\n border-color: var(--checkbox-border-color-checked-active-light);\n }\n}\n.checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-light);\n cursor: not-allowed;\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n}\n.checkbox-input-icon {\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n padding: 1px;\n}\n.checkbox-label {\n padding: var(--checkbox-label-padding);\n line-height: var(--checkbox-line-height);\n}\ninput {\n margin: 0;\n opacity: 0;\n position: absolute;\n pointer-events: none;\n}\n[data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-light) !important;\n}\n\n[dark-mode=\"true\"] {\n .checkbox {\n .checkbox-input {\n background-color: var(--checkbox-background-default-default-dark);\n color: var(--checkbox-color-default-default-dark);\n border-color: var(--checkbox-border-color-default-default-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-dark);\n color: var(--checkbox-color-default-hover-dark);\n border-color: var(--checkbox-border-color-default-hover-dark);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-dark);\n color: var(--checkbox-color-default-active-dark);\n border-color: var(--checkbox-border-color-default-active-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-dark);\n color: var(--checkbox-color-checked-default-dark);\n border-color: var(--checkbox-border-color-checked-default-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-dark);\n color: var(--checkbox-color-checked-hover-dark);\n border-color: var(--checkbox-border-color-checked-hover-dark);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-dark);\n color: var(--checkbox-color-checked-active-dark);\n border-color: var(--checkbox-border-color-checked-active-dark);\n }\n }\n .checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-dark);\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n }\n\n [data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-dark) !important;\n }\n}\n</style>\n","<template>\n <label\n :class=\"['checkbox', { 'checkbox-disabled': disabled }, defaultAttrs.class]\"\n :title=\"defaultAttrs.title\"\n >\n <span class=\"checkbox-input-container\">\n <span\n :class=\"[\n 'checkbox-input',\n {\n 'checkbox-checked': isChecked,\n 'checkbox-focused': focused,\n },\n ]\"\n >\n <font-awesome-icon class=\"checkbox-input-icon\" :icon=\"faCheck\" aria-hidden=\"true\" />\n <input\n v-bind=\"attrs\"\n type=\"checkbox\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n @change=\"handleChange\"\n @focus=\"focused = true\"\n @focusout=\"focused = false\"\n />\n </span>\n </span>\n <span v-if=\"hasDefaultContent\" class=\"checkbox-label\">\n <slot />\n </span>\n <span v-else class=\"checkbox-label\">{{ label }}</span>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { useAttrs, ref, computed, watch } from \"vue\";\nimport type { PropType } from \"vue\";\nimport { FontAwesomeIcon } from \"@fortawesome/vue-fontawesome\";\nimport { faCheck } from \"@fortawesome/free-solid-svg-icons\";\nimport without from \"lodash/without.js\";\nimport { hasRenderableSlotContent } from \"../../../shared/slot\";\n\ntype CheckboxValue = string | Record<string, unknown>;\ntype CheckboxChecked = boolean | CheckboxValue[];\n\ndefineOptions({\n name: \"Checkbox\",\n inheritAttrs: false,\n});\nconst props = defineProps({\n /**\n * Controlled state. Pass a boolean for single checkboxes or an array for checkbox groups (the\n * component will push/pop value). Supports v-model:checked.\n */\n checked: {\n type: [Boolean, Array] as PropType<CheckboxChecked>,\n default: false,\n },\n /**\n * The value inserted or removed from the bound array when used in group mode. Ignored for\n * boolean usage.\n */\n value: {\n type: [String, Object] as PropType<CheckboxValue>,\n default: \"\",\n },\n /** Fallback label text when no default slot is provided. */\n label: {\n type: String,\n default: \"\",\n },\n /** Greys out the checkbox and prevents user interaction. */\n disabled: {\n type: Boolean,\n default: false,\n },\n});\nconst emit = defineEmits<{\n \"update:checked\": [value: CheckboxChecked];\n keyup: [event: KeyboardEvent];\n click: [event: MouseEvent | KeyboardEvent];\n}>();\nconst defaultAttrs = useAttrs() as Record<string, unknown> & {\n class?: unknown;\n title?: string;\n};\nconst slots = defineSlots<{\n /** Custom label content rendered next to the checkbox input. */\n default?: () => unknown;\n}>();\nconst focused = ref(false);\nconst internalChecked = ref<CheckboxChecked>(props.checked);\nconst hasDefaultContent = computed(() => hasRenderableSlotContent(slots.default));\n\nconst isChecked = computed(() => {\n if (typeof internalChecked.value === \"boolean\") {\n return internalChecked.value;\n } else {\n return internalChecked.value.includes(props.value);\n }\n});\nconst attrs = computed(() => {\n const { class: omittedClass, ...inputAttrs } = defaultAttrs;\n void omittedClass;\n return Object.assign({}, inputAttrs, {\n onClick(event: MouseEvent) {\n if (!props.disabled) {\n emit(\"click\", event);\n }\n },\n // Pressing the enter key gets handled like a click.\n onKeyup(event: KeyboardEvent) {\n emit(\"keyup\", event);\n if (props.disabled) {\n return;\n }\n if (event.key === \"Enter\") {\n emit(\"click\", event);\n if (typeof internalChecked.value == \"boolean\") {\n internalChecked.value = !internalChecked.value;\n } else {\n if (internalChecked.value.includes(props.value)) {\n internalChecked.value = without(internalChecked.value, props.value);\n } else {\n internalChecked.value = [...internalChecked.value, props.value];\n }\n }\n }\n },\n });\n});\n\nfunction handleChange(event: Event) {\n const checked = (event.currentTarget as HTMLInputElement).checked;\n\n if (typeof internalChecked.value === \"boolean\") {\n internalChecked.value = checked;\n return;\n }\n\n if (checked && !internalChecked.value.includes(props.value)) {\n internalChecked.value = [...internalChecked.value, props.value];\n } else if (!checked && internalChecked.value.includes(props.value)) {\n internalChecked.value = without(internalChecked.value, props.value);\n }\n}\n\nwatch(\n () => props.checked,\n (checked) => {\n internalChecked.value = checked;\n },\n);\nwatch(\n () => internalChecked.value,\n () => {\n // Only emit the update:checked event if the mutation came from within the checkbox component.\n if (internalChecked.value != props.checked) {\n emit(\"update:checked\", internalChecked.value);\n }\n },\n);\n</script>\n\n<style>\n@import \"theme.css\";\n</style>\n\n<style lang=\"less\" scoped>\n.checkbox {\n position: relative;\n display: flex;\n padding: var(--checkbox-padding);\n\n .checkbox-input-container {\n padding: 5px;\n }\n .checkbox-input {\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--checkbox-height);\n width: var(--checkbox-width);\n box-sizing: border-box;\n border-radius: var(--checkbox-border-radius);\n border: var(--checkbox-border-width) solid;\n background-color: var(--checkbox-background-default-default-light);\n color: var(--checkbox-color-default-default-light);\n border-color: var(--checkbox-border-color-default-default-light);\n transition: var(--checkbox-transition);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-light);\n color: var(--checkbox-color-default-hover-light);\n border-color: var(--checkbox-border-color-default-hover-light);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-light);\n color: var(--checkbox-color-default-active-light);\n border-color: var(--checkbox-border-color-default-active-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-light);\n color: var(--checkbox-color-checked-default-light);\n border-color: var(--checkbox-border-color-checked-default-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-light);\n color: var(--checkbox-color-checked-hover-light);\n border-color: var(--checkbox-border-color-checked-hover-light);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-light);\n color: var(--checkbox-color-checked-active-light);\n border-color: var(--checkbox-border-color-checked-active-light);\n }\n}\n.checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-light);\n cursor: not-allowed;\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n}\n.checkbox-input-icon {\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n padding: 1px;\n}\n.checkbox-label {\n padding: var(--checkbox-label-padding);\n line-height: var(--checkbox-line-height);\n}\ninput {\n margin: 0;\n opacity: 0;\n position: absolute;\n pointer-events: none;\n}\n[data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-light) !important;\n}\n\n[dark-mode=\"true\"] {\n .checkbox {\n .checkbox-input {\n background-color: var(--checkbox-background-default-default-dark);\n color: var(--checkbox-color-default-default-dark);\n border-color: var(--checkbox-border-color-default-default-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-dark);\n color: var(--checkbox-color-default-hover-dark);\n border-color: var(--checkbox-border-color-default-hover-dark);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-dark);\n color: var(--checkbox-color-default-active-dark);\n border-color: var(--checkbox-border-color-default-active-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-dark);\n color: var(--checkbox-color-checked-default-dark);\n border-color: var(--checkbox-border-color-checked-default-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-dark);\n color: var(--checkbox-color-checked-hover-dark);\n border-color: var(--checkbox-border-color-checked-hover-dark);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-dark);\n color: var(--checkbox-color-checked-active-dark);\n border-color: var(--checkbox-border-color-checked-active-dark);\n }\n }\n .checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-dark);\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n }\n\n [data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-dark) !important;\n }\n}\n</style>\n","<template>\n <div class=\"checkbox-skeleton\">\n <Skeleton\n width=\"var(--size-20)\"\n height=\"var(--size-20)\"\n radius=\"var(--border-radius-regular)\"\n :shimmer=\"shimmer\"\n />\n <Skeleton :width=\"labelWidth\" height=\"var(--size-16)\" :shimmer=\"shimmer\" />\n </div>\n</template>\n<script setup lang=\"ts\">\nimport type { PropType } from \"vue\";\nimport { Skeleton } from \"@gospore/skeleton\";\ntype SkeletonDimension = string | number;\ndefineOptions({ name: \"CheckboxSkeleton\" });\ndefineProps({\n /** Sets the placeholder width for the label line. Numbers are converted to px. */\n labelWidth: { type: [String, Number] as PropType<SkeletonDimension>, default: \"10rem\" },\n /** Enables the animated shimmer effect for the placeholder. */\n shimmer: { type: Boolean, default: false },\n});\n</script>\n<style scoped lang=\"less\">\n.checkbox-skeleton {\n display: inline-flex;\n align-items: center;\n gap: var(--size-8);\n}\n</style>\n","<template>\n <div class=\"checkbox-skeleton\">\n <Skeleton\n width=\"var(--size-20)\"\n height=\"var(--size-20)\"\n radius=\"var(--border-radius-regular)\"\n :shimmer=\"shimmer\"\n />\n <Skeleton :width=\"labelWidth\" height=\"var(--size-16)\" :shimmer=\"shimmer\" />\n </div>\n</template>\n<script setup lang=\"ts\">\nimport type { PropType } from \"vue\";\nimport { Skeleton } from \"@gospore/skeleton\";\ntype SkeletonDimension = string | number;\ndefineOptions({ name: \"CheckboxSkeleton\" });\ndefineProps({\n /** Sets the placeholder width for the label line. Numbers are converted to px. */\n labelWidth: { type: [String, Number] as PropType<SkeletonDimension>, default: \"10rem\" },\n /** Enables the animated shimmer effect for the placeholder. */\n shimmer: { type: Boolean, default: false },\n});\n</script>\n<style scoped lang=\"less\">\n.checkbox-skeleton {\n display: inline-flex;\n align-items: center;\n gap: var(--size-8);\n}\n</style>\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("vue"),require("@fortawesome/vue-fontawesome"),require("@fortawesome/free-solid-svg-icons"),require("lodash/without.js"),require("@gospore/skeleton")):typeof define==`function`&&define.amd?define([`exports`,`vue`,`@fortawesome/vue-fontawesome`,`@fortawesome/free-solid-svg-icons`,`lodash/without.js`,`@gospore/skeleton`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.checkbox={},e.Vue,e.VueFontawesome,e.FreeSolidIcons,e.without,e.Skeleton))})(this,function(e,t,n,r,i,a){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var o=Object.create,s=Object.defineProperty,c=Object.getOwnPropertyDescriptor,l=Object.getOwnPropertyNames,u=Object.getPrototypeOf,d=Object.prototype.hasOwnProperty,f=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=l(t),a=0,o=i.length,u;a<o;a++)u=i[a],!d.call(e,u)&&u!==n&&s(e,u,{get:(e=>t[e]).bind(null,u),enumerable:!(r=c(t,u))||r.enumerable});return e};i=((e,t,n)=>(n=e==null?{}:o(u(e)),f(t||!e||!e.__esModule?s(n,`default`,{value:e,enumerable:!0}):n,e)))(i,1);function p(e){return e?m(e()):!1}function m(e){return Array.isArray(e)?e.some(m):typeof e==`string`?e.trim()!==``:typeof e==`number`?!0:!(0,t.isVNode)(e)||!h(e)?!1:e.type===t.Fragment?m(e.children):!0}function h(e){return e.type===t.Comment?!1:e.type===t.Text?typeof e.children==`string`&&e.children.trim()!==``:!0}var g=[`title`],_={class:`checkbox-input-container`},v=[`value`,`disabled`],y={key:0,class:`checkbox-label`},b={key:1,class:`checkbox-label`},x=(0,t.defineComponent)({name:`Checkbox`,inheritAttrs:!1,__name:`Checkbox`,props:{checked:{type:[Boolean,Array],default:!1},value:{type:[String,Object],default:``},label:{type:String,default:``},disabled:{type:Boolean,default:!1}},emits:[`update:checked`,`keyup`,`click`],setup(e,{emit:a}){let o=e,s=a,c=(0,t.useAttrs)(),l=(0,t.useSlots)(),u=(0,t.ref)(!1),d=(0,t.ref)(o.checked),f=(0,t.computed)(()=>p(l.default)),m=(0,t.computed)(()=>typeof d.value==`boolean`?d.value:d.value.includes(o.value)),h=(0,t.computed)(()=>{let{class:e,...t}=c;return Object.assign({},t,{onClick(e){o.disabled||s(`click`,e)},onKeyup(e){s(`keyup`,e),!o.disabled&&e.key===`Enter`&&(s(`click`,e),typeof d.value==`boolean`?d.value=!d.value:d.value.includes(o.value)?d.value=(0,i.default)(d.value,o.value):d.value=[...d.value,o.value])}})});return(0,t.watch)(()=>o.checked,e=>{d.value=e}),(0,t.watch)(()=>d.value,()=>{d.value!=o.checked&&s(`update:checked`,d.value)}),(i,a)=>((0,t.openBlock)(),(0,t.createElementBlock)(`label`,{class:(0,t.normalizeClass)([`checkbox`,{"checkbox-disabled":e.disabled},(0,t.unref)(c).class]),title:(0,t.unref)(c).title},[(0,t.createElementVNode)(`div`,_,[(0,t.createElementVNode)(`span`,{class:(0,t.normalizeClass)([`checkbox-input`,{"checkbox-checked":m.value,"checkbox-focused":u.value}])},[(0,t.createVNode)((0,t.unref)(n.FontAwesomeIcon),{class:`checkbox-input-icon`,icon:(0,t.unref)(r.faCheck),"aria-hidden":`true`},null,8,[`icon`]),(0,t.withDirectives)((0,t.createElementVNode)(`input`,(0,t.mergeProps)(h.value,{"onUpdate:modelValue":a[0]||=e=>d.value=e,type:`checkbox`,value:e.value,disabled:e.disabled,onFocus:a[1]||=e=>u.value=!0,onFocusout:a[2]||=e=>u.value=!1}),null,16,v),[[t.vModelCheckbox,d.value]])],2)]),f.value?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,y,[(0,t.renderSlot)(i.$slots,`default`,{},void 0,!0)])):((0,t.openBlock)(),(0,t.createElementBlock)(`span`,b,(0,t.toDisplayString)(e.label),1))],10,g))}}),S=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},C=S(x,[[`__scopeId`,`data-v-eb918898`]]),w={class:`checkbox-skeleton`},T=S((0,t.defineComponent)({name:`CheckboxSkeleton`,__name:`CheckboxSkeleton`,props:{labelWidth:{type:[String,Number],default:`10rem`},shimmer:{type:Boolean,default:!1}},setup(e){return(n,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,w,[(0,t.createVNode)((0,t.unref)(a.Skeleton),{width:`var(--size-20)`,height:`var(--size-20)`,radius:`var(--border-radius-regular)`,shimmer:e.shimmer},null,8,[`shimmer`]),(0,t.createVNode)((0,t.unref)(a.Skeleton),{width:e.labelWidth,height:`var(--size-16)`,shimmer:e.shimmer},null,8,[`width`,`shimmer`])]))}}),[[`__scopeId`,`data-v-472ff734`]]);e.Checkbox=C,e.CheckboxSkeleton=T});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("vue"),require("@fortawesome/vue-fontawesome"),require("@fortawesome/free-solid-svg-icons"),require("lodash/without.js"),require("@gospore/skeleton")):typeof define==`function`&&define.amd?define([`exports`,`vue`,`@fortawesome/vue-fontawesome`,`@fortawesome/free-solid-svg-icons`,`lodash/without.js`,`@gospore/skeleton`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.checkbox={},e.Vue,e.VueFontawesome,e.FreeSolidIcons,e.without,e.Skeleton))})(this,function(e,t,n,r,i,a){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var o=Object.create,s=Object.defineProperty,c=Object.getOwnPropertyDescriptor,l=Object.getOwnPropertyNames,u=Object.getPrototypeOf,d=Object.prototype.hasOwnProperty,f=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=l(t),a=0,o=i.length,u;a<o;a++)u=i[a],!d.call(e,u)&&u!==n&&s(e,u,{get:(e=>t[e]).bind(null,u),enumerable:!(r=c(t,u))||r.enumerable});return e};i=((e,t,n)=>(n=e==null?{}:o(u(e)),f(t||!e||!e.__esModule||!d.call(e,`default`)?s(n,`default`,{value:e,enumerable:!0}):n,e)))(i,1);function p(e){return e?m(e()):!1}function m(e){return h(e)}function h(e){let n=new WeakSet,r=new WeakSet,i=[{kind:`value`,value:e}];for(;i.length>0;){let e=i.pop();if(e.kind===`leave-array`){n.delete(e.array);continue}let a=e.value;if(Array.isArray(a)){g(i,a,n);continue}if(typeof a==`string`){if(a.trim()!==``)return!0;continue}if(typeof a==`number`)return!0;if(!(!(0,t.isVNode)(a)||!_(a))){if(a.type===t.Fragment){if(r.has(a))continue;r.add(a),i.push({kind:`value`,value:a.children});continue}return!0}}return!1}function g(e,t,n){if(!n.has(t)){n.add(t),e.push({array:t,kind:`leave-array`});for(let n=t.length-1;n>=0;--n)e.push({kind:`value`,value:t[n]})}}function _(e){return e.type===t.Comment?!1:e.type!==t.Text||typeof e.children==`string`&&e.children.trim()!==``}var v=[`title`],y={class:`checkbox-input-container`},b=[`value`,`checked`,`disabled`],x={key:0,class:`checkbox-label`},S={key:1,class:`checkbox-label`},C=(0,t.defineComponent)({name:`Checkbox`,inheritAttrs:!1,__name:`Checkbox`,props:{checked:{type:[Boolean,Array],default:!1},value:{type:[String,Object],default:``},label:{type:String,default:``},disabled:{type:Boolean,default:!1}},emits:[`update:checked`,`keyup`,`click`],setup(e,{emit:a}){let o=e,s=a,c=(0,t.useAttrs)(),l=(0,t.useSlots)(),u=(0,t.ref)(!1),d=(0,t.ref)(o.checked),f=(0,t.computed)(()=>p(l.default)),m=(0,t.computed)(()=>typeof d.value==`boolean`?d.value:d.value.includes(o.value)),h=(0,t.computed)(()=>{let{class:e,...t}=c;return Object.assign({},t,{onClick(e){o.disabled||s(`click`,e)},onKeyup(e){s(`keyup`,e),!o.disabled&&e.key===`Enter`&&(s(`click`,e),typeof d.value==`boolean`?d.value=!d.value:d.value.includes(o.value)?d.value=(0,i.default)(d.value,o.value):d.value=[...d.value,o.value])}})});function g(e){let t=e.currentTarget.checked;if(typeof d.value==`boolean`){d.value=t;return}t&&!d.value.includes(o.value)?d.value=[...d.value,o.value]:!t&&d.value.includes(o.value)&&(d.value=(0,i.default)(d.value,o.value))}return(0,t.watch)(()=>o.checked,e=>{d.value=e}),(0,t.watch)(()=>d.value,()=>{d.value!=o.checked&&s(`update:checked`,d.value)}),(i,a)=>((0,t.openBlock)(),(0,t.createElementBlock)(`label`,{class:(0,t.normalizeClass)([`checkbox`,{"checkbox-disabled":e.disabled},(0,t.unref)(c).class]),title:(0,t.unref)(c).title},[(0,t.createElementVNode)(`span`,y,[(0,t.createElementVNode)(`span`,{class:(0,t.normalizeClass)([`checkbox-input`,{"checkbox-checked":m.value,"checkbox-focused":u.value}])},[(0,t.createVNode)((0,t.unref)(n.FontAwesomeIcon),{class:`checkbox-input-icon`,icon:(0,t.unref)(r.faCheck),"aria-hidden":`true`},null,8,[`icon`]),(0,t.createElementVNode)(`input`,(0,t.mergeProps)(h.value,{type:`checkbox`,value:e.value,checked:m.value,disabled:e.disabled,onChange:g,onFocus:a[0]||=e=>u.value=!0,onFocusout:a[1]||=e=>u.value=!1}),null,16,b)],2)]),f.value?((0,t.openBlock)(),(0,t.createElementBlock)(`span`,x,[(0,t.renderSlot)(i.$slots,`default`,{},void 0,!0)])):((0,t.openBlock)(),(0,t.createElementBlock)(`span`,S,(0,t.toDisplayString)(e.label),1))],10,v))}}),w=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},T=w(C,[[`__scopeId`,`data-v-2c346baa`]]),E={class:`checkbox-skeleton`},D=w((0,t.defineComponent)({name:`CheckboxSkeleton`,__name:`CheckboxSkeleton`,props:{labelWidth:{type:[String,Number],default:`10rem`},shimmer:{type:Boolean,default:!1}},setup(e){return(n,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,E,[(0,t.createVNode)((0,t.unref)(a.Skeleton),{width:`var(--size-20)`,height:`var(--size-20)`,radius:`var(--border-radius-regular)`,shimmer:e.shimmer},null,8,[`shimmer`]),(0,t.createVNode)((0,t.unref)(a.Skeleton),{width:e.labelWidth,height:`var(--size-16)`,shimmer:e.shimmer},null,8,[`width`,`shimmer`])]))}}),[[`__scopeId`,`data-v-472ff734`]]);e.Checkbox=T,e.CheckboxSkeleton=D});
2
2
  //# sourceMappingURL=checkbox.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox.umd.js","names":[],"sources":["../../shared/slot.ts","../src/Checkbox.vue","../src/Checkbox.vue","../src/CheckboxSkeleton.vue","../src/CheckboxSkeleton.vue"],"sourcesContent":["import { Comment, Fragment, isVNode, Text } from \"vue\";\nimport type { VNode, VNodeArrayChildren } from \"vue\";\n\ntype SlotFunction = () => unknown;\n\nexport function collectRenderableVNodes(children: VNodeArrayChildren | VNode[]): VNode[] {\n const nodes: VNode[] = [];\n\n children.forEach((child) => {\n if (Array.isArray(child)) {\n nodes.push(...collectRenderableVNodes(child));\n return;\n }\n if (!isVNode(child) || !isRenderableVNode(child)) {\n return;\n }\n if (child.type === Fragment && Array.isArray(child.children)) {\n nodes.push(...collectRenderableVNodes(child.children));\n return;\n }\n nodes.push(child);\n });\n\n return nodes;\n}\n\nexport function hasRenderableSlotContent(slot?: SlotFunction): boolean {\n if (!slot) {\n return false;\n }\n\n return isRenderableSlotChild(slot());\n}\n\nexport function collectSlotText(children: VNodeArrayChildren): string {\n return children\n .map((child) => {\n if (Array.isArray(child)) {\n return collectSlotText(child);\n }\n if (typeof child === \"string\" || typeof child === \"number\") {\n return String(child);\n }\n if (!isVNode(child) || child.type === Comment) {\n return \"\";\n }\n if (typeof child.children === \"string\") {\n return child.children;\n }\n if (Array.isArray(child.children)) {\n return collectSlotText(child.children);\n }\n return \"\";\n })\n .join(\"\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction isRenderableSlotChild(child: unknown): boolean {\n if (Array.isArray(child)) {\n return child.some(isRenderableSlotChild);\n }\n if (typeof child === \"string\") {\n return child.trim() !== \"\";\n }\n if (typeof child === \"number\") {\n return true;\n }\n if (!isVNode(child) || !isRenderableVNode(child)) {\n return false;\n }\n if (child.type === Fragment) {\n return isRenderableSlotChild(child.children);\n }\n return true;\n}\n\nfunction isRenderableVNode(node: VNode): boolean {\n if (node.type === Comment) {\n return false;\n }\n if (node.type === Text) {\n return typeof node.children === \"string\" && node.children.trim() !== \"\";\n }\n return true;\n}\n","<template>\n <label\n :class=\"['checkbox', { 'checkbox-disabled': disabled }, defaultAttrs.class]\"\n :title=\"defaultAttrs.title\"\n >\n <div class=\"checkbox-input-container\">\n <span\n :class=\"[\n 'checkbox-input',\n {\n 'checkbox-checked': isChecked,\n 'checkbox-focused': focused,\n },\n ]\"\n >\n <font-awesome-icon class=\"checkbox-input-icon\" :icon=\"faCheck\" aria-hidden=\"true\" />\n <input\n v-bind=\"attrs\"\n v-model=\"internalChecked\"\n type=\"checkbox\"\n :value=\"value\"\n :disabled=\"disabled\"\n @focus=\"focused = true\"\n @focusout=\"focused = false\"\n />\n </span>\n </div>\n <div v-if=\"hasDefaultContent\" class=\"checkbox-label\">\n <slot />\n </div>\n <span v-else class=\"checkbox-label\">{{ label }}</span>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { useAttrs, ref, computed, watch } from \"vue\";\nimport type { PropType } from \"vue\";\nimport { FontAwesomeIcon } from \"@fortawesome/vue-fontawesome\";\nimport { faCheck } from \"@fortawesome/free-solid-svg-icons\";\nimport without from \"lodash/without.js\";\nimport { hasRenderableSlotContent } from \"../../shared/slot\";\n\ntype CheckboxValue = string | Record<string, unknown>;\ntype CheckboxChecked = boolean | CheckboxValue[];\n\ndefineOptions({\n name: \"Checkbox\",\n inheritAttrs: false,\n});\nconst props = defineProps({\n /**\n * Controlled state. Pass a boolean for single checkboxes or an array for checkbox groups (the\n * component will push/pop value). Supports v-model:checked.\n */\n checked: {\n type: [Boolean, Array] as PropType<CheckboxChecked>,\n default: false,\n },\n /**\n * The value inserted or removed from the bound array when used in group mode. Ignored for\n * boolean usage.\n */\n value: {\n type: [String, Object] as PropType<CheckboxValue>,\n default: \"\",\n },\n /** Fallback label text when no default slot is provided. */\n label: {\n type: String,\n default: \"\",\n },\n /** Greys out the checkbox and prevents user interaction. */\n disabled: {\n type: Boolean,\n default: false,\n },\n});\nconst emit = defineEmits([\"update:checked\", \"keyup\", \"click\"]);\nconst defaultAttrs = useAttrs() as Record<string, unknown> & {\n class?: unknown;\n title?: string;\n};\nconst slots = defineSlots<{\n /** Custom label content rendered next to the checkbox input. */\n default?: () => unknown;\n}>();\nconst focused = ref(false);\nconst internalChecked = ref<CheckboxChecked>(props.checked);\nconst hasDefaultContent = computed(() => hasRenderableSlotContent(slots.default));\n\nconst isChecked = computed(() => {\n if (typeof internalChecked.value === \"boolean\") {\n return internalChecked.value;\n } else {\n return internalChecked.value.includes(props.value);\n }\n});\nconst attrs = computed(() => {\n const { class: omittedClass, ...inputAttrs } = defaultAttrs;\n void omittedClass;\n return Object.assign({}, inputAttrs, {\n onClick(event: MouseEvent) {\n if (!props.disabled) {\n emit(\"click\", event);\n }\n },\n // Pressing the enter key gets handled like a click.\n onKeyup(event: KeyboardEvent) {\n emit(\"keyup\", event);\n if (props.disabled) {\n return;\n }\n if (event.key === \"Enter\") {\n emit(\"click\", event);\n if (typeof internalChecked.value == \"boolean\") {\n internalChecked.value = !internalChecked.value;\n } else {\n if (internalChecked.value.includes(props.value)) {\n internalChecked.value = without(internalChecked.value, props.value);\n } else {\n internalChecked.value = [...internalChecked.value, props.value];\n }\n }\n }\n },\n });\n});\n\nwatch(\n () => props.checked,\n (checked) => {\n internalChecked.value = checked;\n },\n);\nwatch(\n () => internalChecked.value,\n () => {\n // Only emit the update:checked event if the mutation came from within the checkbox component.\n if (internalChecked.value != props.checked) {\n emit(\"update:checked\", internalChecked.value);\n }\n },\n);\n</script>\n\n<style>\n@import \"theme.css\";\n</style>\n\n<style lang=\"less\" scoped>\n.checkbox {\n position: relative;\n display: flex;\n padding: var(--checkbox-padding);\n\n .checkbox-input-container {\n padding: 5px;\n }\n .checkbox-input {\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--checkbox-height);\n width: var(--checkbox-width);\n box-sizing: border-box;\n border-radius: var(--checkbox-border-radius);\n border: var(--checkbox-border-width) solid;\n background-color: var(--checkbox-background-default-default-light);\n color: var(--checkbox-color-default-default-light);\n border-color: var(--checkbox-border-color-default-default-light);\n transition: var(--checkbox-transition);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-light);\n color: var(--checkbox-color-default-hover-light);\n border-color: var(--checkbox-border-color-default-hover-light);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-light);\n color: var(--checkbox-color-default-active-light);\n border-color: var(--checkbox-border-color-default-active-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-light);\n color: var(--checkbox-color-checked-default-light);\n border-color: var(--checkbox-border-color-checked-default-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-light);\n color: var(--checkbox-color-checked-hover-light);\n border-color: var(--checkbox-border-color-checked-hover-light);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-light);\n color: var(--checkbox-color-checked-active-light);\n border-color: var(--checkbox-border-color-checked-active-light);\n }\n}\n.checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-light);\n cursor: not-allowed;\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n}\n.checkbox-input-icon {\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n padding: 1px;\n}\n.checkbox-label {\n padding: var(--checkbox-label-padding);\n line-height: var(--checkbox-line-height);\n}\ninput {\n margin: 0;\n opacity: 0;\n position: absolute;\n pointer-events: none;\n}\n[data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-light) !important;\n}\n\n[dark-mode=\"true\"] {\n .checkbox {\n .checkbox-input {\n background-color: var(--checkbox-background-default-default-dark);\n color: var(--checkbox-color-default-default-dark);\n border-color: var(--checkbox-border-color-default-default-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-dark);\n color: var(--checkbox-color-default-hover-dark);\n border-color: var(--checkbox-border-color-default-hover-dark);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-dark);\n color: var(--checkbox-color-default-active-dark);\n border-color: var(--checkbox-border-color-default-active-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-dark);\n color: var(--checkbox-color-checked-default-dark);\n border-color: var(--checkbox-border-color-checked-default-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-dark);\n color: var(--checkbox-color-checked-hover-dark);\n border-color: var(--checkbox-border-color-checked-hover-dark);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-dark);\n color: var(--checkbox-color-checked-active-dark);\n border-color: var(--checkbox-border-color-checked-active-dark);\n }\n }\n .checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-dark);\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n }\n\n [data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-dark) !important;\n }\n}\n</style>\n","<template>\n <label\n :class=\"['checkbox', { 'checkbox-disabled': disabled }, defaultAttrs.class]\"\n :title=\"defaultAttrs.title\"\n >\n <div class=\"checkbox-input-container\">\n <span\n :class=\"[\n 'checkbox-input',\n {\n 'checkbox-checked': isChecked,\n 'checkbox-focused': focused,\n },\n ]\"\n >\n <font-awesome-icon class=\"checkbox-input-icon\" :icon=\"faCheck\" aria-hidden=\"true\" />\n <input\n v-bind=\"attrs\"\n v-model=\"internalChecked\"\n type=\"checkbox\"\n :value=\"value\"\n :disabled=\"disabled\"\n @focus=\"focused = true\"\n @focusout=\"focused = false\"\n />\n </span>\n </div>\n <div v-if=\"hasDefaultContent\" class=\"checkbox-label\">\n <slot />\n </div>\n <span v-else class=\"checkbox-label\">{{ label }}</span>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { useAttrs, ref, computed, watch } from \"vue\";\nimport type { PropType } from \"vue\";\nimport { FontAwesomeIcon } from \"@fortawesome/vue-fontawesome\";\nimport { faCheck } from \"@fortawesome/free-solid-svg-icons\";\nimport without from \"lodash/without.js\";\nimport { hasRenderableSlotContent } from \"../../shared/slot\";\n\ntype CheckboxValue = string | Record<string, unknown>;\ntype CheckboxChecked = boolean | CheckboxValue[];\n\ndefineOptions({\n name: \"Checkbox\",\n inheritAttrs: false,\n});\nconst props = defineProps({\n /**\n * Controlled state. Pass a boolean for single checkboxes or an array for checkbox groups (the\n * component will push/pop value). Supports v-model:checked.\n */\n checked: {\n type: [Boolean, Array] as PropType<CheckboxChecked>,\n default: false,\n },\n /**\n * The value inserted or removed from the bound array when used in group mode. Ignored for\n * boolean usage.\n */\n value: {\n type: [String, Object] as PropType<CheckboxValue>,\n default: \"\",\n },\n /** Fallback label text when no default slot is provided. */\n label: {\n type: String,\n default: \"\",\n },\n /** Greys out the checkbox and prevents user interaction. */\n disabled: {\n type: Boolean,\n default: false,\n },\n});\nconst emit = defineEmits<{\n \"update:checked\": [value: CheckboxChecked];\n keyup: [event: KeyboardEvent];\n click: [event: MouseEvent | KeyboardEvent];\n}>();\nconst defaultAttrs = useAttrs() as Record<string, unknown> & {\n class?: unknown;\n title?: string;\n};\nconst slots = defineSlots<{\n /** Custom label content rendered next to the checkbox input. */\n default?: () => unknown;\n}>();\nconst focused = ref(false);\nconst internalChecked = ref<CheckboxChecked>(props.checked);\nconst hasDefaultContent = computed(() => hasRenderableSlotContent(slots.default));\n\nconst isChecked = computed(() => {\n if (typeof internalChecked.value === \"boolean\") {\n return internalChecked.value;\n } else {\n return internalChecked.value.includes(props.value);\n }\n});\nconst attrs = computed(() => {\n const { class: omittedClass, ...inputAttrs } = defaultAttrs;\n void omittedClass;\n return Object.assign({}, inputAttrs, {\n onClick(event: MouseEvent) {\n if (!props.disabled) {\n emit(\"click\", event);\n }\n },\n // Pressing the enter key gets handled like a click.\n onKeyup(event: KeyboardEvent) {\n emit(\"keyup\", event);\n if (props.disabled) {\n return;\n }\n if (event.key === \"Enter\") {\n emit(\"click\", event);\n if (typeof internalChecked.value == \"boolean\") {\n internalChecked.value = !internalChecked.value;\n } else {\n if (internalChecked.value.includes(props.value)) {\n internalChecked.value = without(internalChecked.value, props.value);\n } else {\n internalChecked.value = [...internalChecked.value, props.value];\n }\n }\n }\n },\n });\n});\n\nwatch(\n () => props.checked,\n (checked) => {\n internalChecked.value = checked;\n },\n);\nwatch(\n () => internalChecked.value,\n () => {\n // Only emit the update:checked event if the mutation came from within the checkbox component.\n if (internalChecked.value != props.checked) {\n emit(\"update:checked\", internalChecked.value);\n }\n },\n);\n</script>\n\n<style>\n@import \"theme.css\";\n</style>\n\n<style lang=\"less\" scoped>\n.checkbox {\n position: relative;\n display: flex;\n padding: var(--checkbox-padding);\n\n .checkbox-input-container {\n padding: 5px;\n }\n .checkbox-input {\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--checkbox-height);\n width: var(--checkbox-width);\n box-sizing: border-box;\n border-radius: var(--checkbox-border-radius);\n border: var(--checkbox-border-width) solid;\n background-color: var(--checkbox-background-default-default-light);\n color: var(--checkbox-color-default-default-light);\n border-color: var(--checkbox-border-color-default-default-light);\n transition: var(--checkbox-transition);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-light);\n color: var(--checkbox-color-default-hover-light);\n border-color: var(--checkbox-border-color-default-hover-light);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-light);\n color: var(--checkbox-color-default-active-light);\n border-color: var(--checkbox-border-color-default-active-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-light);\n color: var(--checkbox-color-checked-default-light);\n border-color: var(--checkbox-border-color-checked-default-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-light);\n color: var(--checkbox-color-checked-hover-light);\n border-color: var(--checkbox-border-color-checked-hover-light);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-light);\n color: var(--checkbox-color-checked-active-light);\n border-color: var(--checkbox-border-color-checked-active-light);\n }\n}\n.checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-light);\n cursor: not-allowed;\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n}\n.checkbox-input-icon {\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n padding: 1px;\n}\n.checkbox-label {\n padding: var(--checkbox-label-padding);\n line-height: var(--checkbox-line-height);\n}\ninput {\n margin: 0;\n opacity: 0;\n position: absolute;\n pointer-events: none;\n}\n[data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-light) !important;\n}\n\n[dark-mode=\"true\"] {\n .checkbox {\n .checkbox-input {\n background-color: var(--checkbox-background-default-default-dark);\n color: var(--checkbox-color-default-default-dark);\n border-color: var(--checkbox-border-color-default-default-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-dark);\n color: var(--checkbox-color-default-hover-dark);\n border-color: var(--checkbox-border-color-default-hover-dark);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-dark);\n color: var(--checkbox-color-default-active-dark);\n border-color: var(--checkbox-border-color-default-active-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-dark);\n color: var(--checkbox-color-checked-default-dark);\n border-color: var(--checkbox-border-color-checked-default-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-dark);\n color: var(--checkbox-color-checked-hover-dark);\n border-color: var(--checkbox-border-color-checked-hover-dark);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-dark);\n color: var(--checkbox-color-checked-active-dark);\n border-color: var(--checkbox-border-color-checked-active-dark);\n }\n }\n .checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-dark);\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n }\n\n [data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-dark) !important;\n }\n}\n</style>\n","<template>\n <div class=\"checkbox-skeleton\">\n <Skeleton\n width=\"var(--size-20)\"\n height=\"var(--size-20)\"\n radius=\"var(--border-radius-regular)\"\n :shimmer=\"shimmer\"\n />\n <Skeleton :width=\"labelWidth\" height=\"var(--size-16)\" :shimmer=\"shimmer\" />\n </div>\n</template>\n<script setup lang=\"ts\">\nimport type { PropType } from \"vue\";\nimport { Skeleton } from \"@gospore/skeleton\";\ntype SkeletonDimension = string | number;\ndefineOptions({ name: \"CheckboxSkeleton\" });\ndefineProps({\n /** Sets the placeholder width for the label line. Numbers are converted to px. */\n labelWidth: { type: [String, Number] as PropType<SkeletonDimension>, default: \"10rem\" },\n /** Enables the animated shimmer effect for the placeholder. */\n shimmer: { type: Boolean, default: false },\n});\n</script>\n<style scoped lang=\"less\">\n.checkbox-skeleton {\n display: inline-flex;\n align-items: center;\n gap: var(--size-8);\n}\n</style>\n","<template>\n <div class=\"checkbox-skeleton\">\n <Skeleton\n width=\"var(--size-20)\"\n height=\"var(--size-20)\"\n radius=\"var(--border-radius-regular)\"\n :shimmer=\"shimmer\"\n />\n <Skeleton :width=\"labelWidth\" height=\"var(--size-16)\" :shimmer=\"shimmer\" />\n </div>\n</template>\n<script setup lang=\"ts\">\nimport type { PropType } from \"vue\";\nimport { Skeleton } from \"@gospore/skeleton\";\ntype SkeletonDimension = string | number;\ndefineOptions({ name: \"CheckboxSkeleton\" });\ndefineProps({\n /** Sets the placeholder width for the label line. Numbers are converted to px. */\n labelWidth: { type: [String, Number] as PropType<SkeletonDimension>, default: \"10rem\" },\n /** Enables the animated shimmer effect for the placeholder. */\n shimmer: { type: Boolean, default: false },\n});\n</script>\n<style scoped lang=\"less\">\n.checkbox-skeleton {\n display: inline-flex;\n align-items: center;\n gap: var(--size-8);\n}\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"checkbox.umd.js","names":[],"sources":["../../../shared/slot.ts","../src/Checkbox.vue","../src/Checkbox.vue","../src/CheckboxSkeleton.vue","../src/CheckboxSkeleton.vue"],"sourcesContent":["import { Comment, Fragment, isVNode, Text } from \"vue\";\nimport type { VNode, VNodeArrayChildren } from \"vue\";\n\ntype SlotFunction = () => unknown;\n\ntype TraversalEntry = { kind: \"value\"; value: unknown } | { array: unknown[]; kind: \"leave-array\" };\n\nexport function collectRenderableVNodes(children: VNodeArrayChildren | VNode[]): VNode[] {\n const nodes: VNode[] = [];\n const activeArrays = new WeakSet<unknown[]>();\n const stack: TraversalEntry[] = [];\n pushArray(stack, children as unknown[], activeArrays);\n\n while (stack.length > 0) {\n const entry = stack.pop()!;\n if (entry.kind === \"leave-array\") {\n activeArrays.delete(entry.array);\n continue;\n }\n\n const child = entry.value;\n if (Array.isArray(child)) {\n pushArray(stack, child, activeArrays);\n continue;\n }\n if (!isVNode(child) || !isRenderableVNode(child)) {\n continue;\n }\n if (child.type === Fragment && Array.isArray(child.children)) {\n pushArray(stack, child.children, activeArrays);\n continue;\n }\n nodes.push(child);\n }\n\n return nodes;\n}\n\nexport function hasRenderableSlotContent(slot?: SlotFunction): boolean {\n if (!slot) {\n return false;\n }\n\n return hasRenderableVNodeContent(slot());\n}\n\nexport function hasRenderableVNodeContent(children: unknown): boolean {\n return isRenderableSlotChild(children);\n}\n\nexport function collectSlotText(children: VNodeArrayChildren): string {\n const chunks: string[] = [];\n const activeArrays = new WeakSet<unknown[]>();\n const stack: TraversalEntry[] = [];\n pushArray(stack, children as unknown[], activeArrays);\n\n while (stack.length > 0) {\n const entry = stack.pop()!;\n if (entry.kind === \"leave-array\") {\n activeArrays.delete(entry.array);\n continue;\n }\n\n const child = entry.value;\n if (Array.isArray(child)) {\n pushArray(stack, child, activeArrays);\n continue;\n }\n if (typeof child === \"string\" || typeof child === \"number\") {\n chunks.push(String(child));\n continue;\n }\n if (!isVNode(child) || child.type === Comment) {\n continue;\n }\n if (typeof child.children === \"string\") {\n chunks.push(child.children);\n continue;\n }\n if (Array.isArray(child.children)) {\n pushArray(stack, child.children, activeArrays);\n }\n }\n\n return chunks.join(\"\").replace(/\\s+/g, \" \").trim();\n}\n\nfunction isRenderableSlotChild(child: unknown): boolean {\n const activeArrays = new WeakSet<unknown[]>();\n const visitedFragments = new WeakSet<VNode>();\n const stack: TraversalEntry[] = [{ kind: \"value\", value: child }];\n\n while (stack.length > 0) {\n const entry = stack.pop()!;\n if (entry.kind === \"leave-array\") {\n activeArrays.delete(entry.array);\n continue;\n }\n\n const current = entry.value;\n if (Array.isArray(current)) {\n pushArray(stack, current, activeArrays);\n continue;\n }\n if (typeof current === \"string\") {\n if (current.trim() !== \"\") {\n return true;\n }\n continue;\n }\n if (typeof current === \"number\") {\n return true;\n }\n if (!isVNode(current) || !isRenderableVNode(current)) {\n continue;\n }\n if (current.type === Fragment) {\n if (visitedFragments.has(current)) {\n continue;\n }\n visitedFragments.add(current);\n stack.push({ kind: \"value\", value: current.children });\n continue;\n }\n return true;\n }\n\n return false;\n}\n\nfunction pushArray(stack: TraversalEntry[], array: unknown[], activeArrays: WeakSet<unknown[]>) {\n if (activeArrays.has(array)) {\n return;\n }\n\n activeArrays.add(array);\n stack.push({ array, kind: \"leave-array\" });\n for (let index = array.length - 1; index >= 0; index -= 1) {\n stack.push({ kind: \"value\", value: array[index] });\n }\n}\n\nfunction isRenderableVNode(node: VNode): boolean {\n if (node.type === Comment) {\n return false;\n }\n if (node.type === Text) {\n return typeof node.children === \"string\" && node.children.trim() !== \"\";\n }\n return true;\n}\n","<template>\n <label\n :class=\"['checkbox', { 'checkbox-disabled': disabled }, defaultAttrs.class]\"\n :title=\"defaultAttrs.title\"\n >\n <span class=\"checkbox-input-container\">\n <span\n :class=\"[\n 'checkbox-input',\n {\n 'checkbox-checked': isChecked,\n 'checkbox-focused': focused,\n },\n ]\"\n >\n <font-awesome-icon class=\"checkbox-input-icon\" :icon=\"faCheck\" aria-hidden=\"true\" />\n <input\n v-bind=\"attrs\"\n type=\"checkbox\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n @change=\"handleChange\"\n @focus=\"focused = true\"\n @focusout=\"focused = false\"\n />\n </span>\n </span>\n <span v-if=\"hasDefaultContent\" class=\"checkbox-label\">\n <slot />\n </span>\n <span v-else class=\"checkbox-label\">{{ label }}</span>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { useAttrs, ref, computed, watch } from \"vue\";\nimport type { PropType } from \"vue\";\nimport { FontAwesomeIcon } from \"@fortawesome/vue-fontawesome\";\nimport { faCheck } from \"@fortawesome/free-solid-svg-icons\";\nimport without from \"lodash/without.js\";\nimport { hasRenderableSlotContent } from \"../../../shared/slot\";\n\ntype CheckboxValue = string | Record<string, unknown>;\ntype CheckboxChecked = boolean | CheckboxValue[];\n\ndefineOptions({\n name: \"Checkbox\",\n inheritAttrs: false,\n});\nconst props = defineProps({\n /**\n * Controlled state. Pass a boolean for single checkboxes or an array for checkbox groups (the\n * component will push/pop value). Supports v-model:checked.\n */\n checked: {\n type: [Boolean, Array] as PropType<CheckboxChecked>,\n default: false,\n },\n /**\n * The value inserted or removed from the bound array when used in group mode. Ignored for\n * boolean usage.\n */\n value: {\n type: [String, Object] as PropType<CheckboxValue>,\n default: \"\",\n },\n /** Fallback label text when no default slot is provided. */\n label: {\n type: String,\n default: \"\",\n },\n /** Greys out the checkbox and prevents user interaction. */\n disabled: {\n type: Boolean,\n default: false,\n },\n});\nconst emit = defineEmits([\"update:checked\", \"keyup\", \"click\"]);\nconst defaultAttrs = useAttrs() as Record<string, unknown> & {\n class?: unknown;\n title?: string;\n};\nconst slots = defineSlots<{\n /** Custom label content rendered next to the checkbox input. */\n default?: () => unknown;\n}>();\nconst focused = ref(false);\nconst internalChecked = ref<CheckboxChecked>(props.checked);\nconst hasDefaultContent = computed(() => hasRenderableSlotContent(slots.default));\n\nconst isChecked = computed(() => {\n if (typeof internalChecked.value === \"boolean\") {\n return internalChecked.value;\n } else {\n return internalChecked.value.includes(props.value);\n }\n});\nconst attrs = computed(() => {\n const { class: omittedClass, ...inputAttrs } = defaultAttrs;\n void omittedClass;\n return Object.assign({}, inputAttrs, {\n onClick(event: MouseEvent) {\n if (!props.disabled) {\n emit(\"click\", event);\n }\n },\n // Pressing the enter key gets handled like a click.\n onKeyup(event: KeyboardEvent) {\n emit(\"keyup\", event);\n if (props.disabled) {\n return;\n }\n if (event.key === \"Enter\") {\n emit(\"click\", event);\n if (typeof internalChecked.value == \"boolean\") {\n internalChecked.value = !internalChecked.value;\n } else {\n if (internalChecked.value.includes(props.value)) {\n internalChecked.value = without(internalChecked.value, props.value);\n } else {\n internalChecked.value = [...internalChecked.value, props.value];\n }\n }\n }\n },\n });\n});\n\nfunction handleChange(event: Event) {\n const checked = (event.currentTarget as HTMLInputElement).checked;\n\n if (typeof internalChecked.value === \"boolean\") {\n internalChecked.value = checked;\n return;\n }\n\n if (checked && !internalChecked.value.includes(props.value)) {\n internalChecked.value = [...internalChecked.value, props.value];\n } else if (!checked && internalChecked.value.includes(props.value)) {\n internalChecked.value = without(internalChecked.value, props.value);\n }\n}\n\nwatch(\n () => props.checked,\n (checked) => {\n internalChecked.value = checked;\n },\n);\nwatch(\n () => internalChecked.value,\n () => {\n // Only emit the update:checked event if the mutation came from within the checkbox component.\n if (internalChecked.value != props.checked) {\n emit(\"update:checked\", internalChecked.value);\n }\n },\n);\n</script>\n\n<style>\n@import \"theme.css\";\n</style>\n\n<style lang=\"less\" scoped>\n.checkbox {\n position: relative;\n display: flex;\n padding: var(--checkbox-padding);\n\n .checkbox-input-container {\n padding: 5px;\n }\n .checkbox-input {\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--checkbox-height);\n width: var(--checkbox-width);\n box-sizing: border-box;\n border-radius: var(--checkbox-border-radius);\n border: var(--checkbox-border-width) solid;\n background-color: var(--checkbox-background-default-default-light);\n color: var(--checkbox-color-default-default-light);\n border-color: var(--checkbox-border-color-default-default-light);\n transition: var(--checkbox-transition);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-light);\n color: var(--checkbox-color-default-hover-light);\n border-color: var(--checkbox-border-color-default-hover-light);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-light);\n color: var(--checkbox-color-default-active-light);\n border-color: var(--checkbox-border-color-default-active-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-light);\n color: var(--checkbox-color-checked-default-light);\n border-color: var(--checkbox-border-color-checked-default-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-light);\n color: var(--checkbox-color-checked-hover-light);\n border-color: var(--checkbox-border-color-checked-hover-light);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-light);\n color: var(--checkbox-color-checked-active-light);\n border-color: var(--checkbox-border-color-checked-active-light);\n }\n}\n.checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-light);\n cursor: not-allowed;\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n}\n.checkbox-input-icon {\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n padding: 1px;\n}\n.checkbox-label {\n padding: var(--checkbox-label-padding);\n line-height: var(--checkbox-line-height);\n}\ninput {\n margin: 0;\n opacity: 0;\n position: absolute;\n pointer-events: none;\n}\n[data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-light) !important;\n}\n\n[dark-mode=\"true\"] {\n .checkbox {\n .checkbox-input {\n background-color: var(--checkbox-background-default-default-dark);\n color: var(--checkbox-color-default-default-dark);\n border-color: var(--checkbox-border-color-default-default-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-dark);\n color: var(--checkbox-color-default-hover-dark);\n border-color: var(--checkbox-border-color-default-hover-dark);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-dark);\n color: var(--checkbox-color-default-active-dark);\n border-color: var(--checkbox-border-color-default-active-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-dark);\n color: var(--checkbox-color-checked-default-dark);\n border-color: var(--checkbox-border-color-checked-default-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-dark);\n color: var(--checkbox-color-checked-hover-dark);\n border-color: var(--checkbox-border-color-checked-hover-dark);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-dark);\n color: var(--checkbox-color-checked-active-dark);\n border-color: var(--checkbox-border-color-checked-active-dark);\n }\n }\n .checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-dark);\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n }\n\n [data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-dark) !important;\n }\n}\n</style>\n","<template>\n <label\n :class=\"['checkbox', { 'checkbox-disabled': disabled }, defaultAttrs.class]\"\n :title=\"defaultAttrs.title\"\n >\n <span class=\"checkbox-input-container\">\n <span\n :class=\"[\n 'checkbox-input',\n {\n 'checkbox-checked': isChecked,\n 'checkbox-focused': focused,\n },\n ]\"\n >\n <font-awesome-icon class=\"checkbox-input-icon\" :icon=\"faCheck\" aria-hidden=\"true\" />\n <input\n v-bind=\"attrs\"\n type=\"checkbox\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n @change=\"handleChange\"\n @focus=\"focused = true\"\n @focusout=\"focused = false\"\n />\n </span>\n </span>\n <span v-if=\"hasDefaultContent\" class=\"checkbox-label\">\n <slot />\n </span>\n <span v-else class=\"checkbox-label\">{{ label }}</span>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { useAttrs, ref, computed, watch } from \"vue\";\nimport type { PropType } from \"vue\";\nimport { FontAwesomeIcon } from \"@fortawesome/vue-fontawesome\";\nimport { faCheck } from \"@fortawesome/free-solid-svg-icons\";\nimport without from \"lodash/without.js\";\nimport { hasRenderableSlotContent } from \"../../../shared/slot\";\n\ntype CheckboxValue = string | Record<string, unknown>;\ntype CheckboxChecked = boolean | CheckboxValue[];\n\ndefineOptions({\n name: \"Checkbox\",\n inheritAttrs: false,\n});\nconst props = defineProps({\n /**\n * Controlled state. Pass a boolean for single checkboxes or an array for checkbox groups (the\n * component will push/pop value). Supports v-model:checked.\n */\n checked: {\n type: [Boolean, Array] as PropType<CheckboxChecked>,\n default: false,\n },\n /**\n * The value inserted or removed from the bound array when used in group mode. Ignored for\n * boolean usage.\n */\n value: {\n type: [String, Object] as PropType<CheckboxValue>,\n default: \"\",\n },\n /** Fallback label text when no default slot is provided. */\n label: {\n type: String,\n default: \"\",\n },\n /** Greys out the checkbox and prevents user interaction. */\n disabled: {\n type: Boolean,\n default: false,\n },\n});\nconst emit = defineEmits<{\n \"update:checked\": [value: CheckboxChecked];\n keyup: [event: KeyboardEvent];\n click: [event: MouseEvent | KeyboardEvent];\n}>();\nconst defaultAttrs = useAttrs() as Record<string, unknown> & {\n class?: unknown;\n title?: string;\n};\nconst slots = defineSlots<{\n /** Custom label content rendered next to the checkbox input. */\n default?: () => unknown;\n}>();\nconst focused = ref(false);\nconst internalChecked = ref<CheckboxChecked>(props.checked);\nconst hasDefaultContent = computed(() => hasRenderableSlotContent(slots.default));\n\nconst isChecked = computed(() => {\n if (typeof internalChecked.value === \"boolean\") {\n return internalChecked.value;\n } else {\n return internalChecked.value.includes(props.value);\n }\n});\nconst attrs = computed(() => {\n const { class: omittedClass, ...inputAttrs } = defaultAttrs;\n void omittedClass;\n return Object.assign({}, inputAttrs, {\n onClick(event: MouseEvent) {\n if (!props.disabled) {\n emit(\"click\", event);\n }\n },\n // Pressing the enter key gets handled like a click.\n onKeyup(event: KeyboardEvent) {\n emit(\"keyup\", event);\n if (props.disabled) {\n return;\n }\n if (event.key === \"Enter\") {\n emit(\"click\", event);\n if (typeof internalChecked.value == \"boolean\") {\n internalChecked.value = !internalChecked.value;\n } else {\n if (internalChecked.value.includes(props.value)) {\n internalChecked.value = without(internalChecked.value, props.value);\n } else {\n internalChecked.value = [...internalChecked.value, props.value];\n }\n }\n }\n },\n });\n});\n\nfunction handleChange(event: Event) {\n const checked = (event.currentTarget as HTMLInputElement).checked;\n\n if (typeof internalChecked.value === \"boolean\") {\n internalChecked.value = checked;\n return;\n }\n\n if (checked && !internalChecked.value.includes(props.value)) {\n internalChecked.value = [...internalChecked.value, props.value];\n } else if (!checked && internalChecked.value.includes(props.value)) {\n internalChecked.value = without(internalChecked.value, props.value);\n }\n}\n\nwatch(\n () => props.checked,\n (checked) => {\n internalChecked.value = checked;\n },\n);\nwatch(\n () => internalChecked.value,\n () => {\n // Only emit the update:checked event if the mutation came from within the checkbox component.\n if (internalChecked.value != props.checked) {\n emit(\"update:checked\", internalChecked.value);\n }\n },\n);\n</script>\n\n<style>\n@import \"theme.css\";\n</style>\n\n<style lang=\"less\" scoped>\n.checkbox {\n position: relative;\n display: flex;\n padding: var(--checkbox-padding);\n\n .checkbox-input-container {\n padding: 5px;\n }\n .checkbox-input {\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--checkbox-height);\n width: var(--checkbox-width);\n box-sizing: border-box;\n border-radius: var(--checkbox-border-radius);\n border: var(--checkbox-border-width) solid;\n background-color: var(--checkbox-background-default-default-light);\n color: var(--checkbox-color-default-default-light);\n border-color: var(--checkbox-border-color-default-default-light);\n transition: var(--checkbox-transition);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-light);\n color: var(--checkbox-color-default-hover-light);\n border-color: var(--checkbox-border-color-default-hover-light);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-light);\n color: var(--checkbox-color-default-active-light);\n border-color: var(--checkbox-border-color-default-active-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-light);\n color: var(--checkbox-color-checked-default-light);\n border-color: var(--checkbox-border-color-checked-default-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-light);\n color: var(--checkbox-color-checked-hover-light);\n border-color: var(--checkbox-border-color-checked-hover-light);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-light);\n color: var(--checkbox-color-checked-active-light);\n border-color: var(--checkbox-border-color-checked-active-light);\n }\n}\n.checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-light);\n cursor: not-allowed;\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n}\n.checkbox-input-icon {\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n padding: 1px;\n}\n.checkbox-label {\n padding: var(--checkbox-label-padding);\n line-height: var(--checkbox-line-height);\n}\ninput {\n margin: 0;\n opacity: 0;\n position: absolute;\n pointer-events: none;\n}\n[data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-light) !important;\n}\n\n[dark-mode=\"true\"] {\n .checkbox {\n .checkbox-input {\n background-color: var(--checkbox-background-default-default-dark);\n color: var(--checkbox-color-default-default-dark);\n border-color: var(--checkbox-border-color-default-default-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-dark);\n color: var(--checkbox-color-default-hover-dark);\n border-color: var(--checkbox-border-color-default-hover-dark);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-dark);\n color: var(--checkbox-color-default-active-dark);\n border-color: var(--checkbox-border-color-default-active-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-dark);\n color: var(--checkbox-color-checked-default-dark);\n border-color: var(--checkbox-border-color-checked-default-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-dark);\n color: var(--checkbox-color-checked-hover-dark);\n border-color: var(--checkbox-border-color-checked-hover-dark);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-dark);\n color: var(--checkbox-color-checked-active-dark);\n border-color: var(--checkbox-border-color-checked-active-dark);\n }\n }\n .checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-dark);\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n }\n\n [data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-dark) !important;\n }\n}\n</style>\n","<template>\n <div class=\"checkbox-skeleton\">\n <Skeleton\n width=\"var(--size-20)\"\n height=\"var(--size-20)\"\n radius=\"var(--border-radius-regular)\"\n :shimmer=\"shimmer\"\n />\n <Skeleton :width=\"labelWidth\" height=\"var(--size-16)\" :shimmer=\"shimmer\" />\n </div>\n</template>\n<script setup lang=\"ts\">\nimport type { PropType } from \"vue\";\nimport { Skeleton } from \"@gospore/skeleton\";\ntype SkeletonDimension = string | number;\ndefineOptions({ name: \"CheckboxSkeleton\" });\ndefineProps({\n /** Sets the placeholder width for the label line. Numbers are converted to px. */\n labelWidth: { type: [String, Number] as PropType<SkeletonDimension>, default: \"10rem\" },\n /** Enables the animated shimmer effect for the placeholder. */\n shimmer: { type: Boolean, default: false },\n});\n</script>\n<style scoped lang=\"less\">\n.checkbox-skeleton {\n display: inline-flex;\n align-items: center;\n gap: var(--size-8);\n}\n</style>\n","<template>\n <div class=\"checkbox-skeleton\">\n <Skeleton\n width=\"var(--size-20)\"\n height=\"var(--size-20)\"\n radius=\"var(--border-radius-regular)\"\n :shimmer=\"shimmer\"\n />\n <Skeleton :width=\"labelWidth\" height=\"var(--size-16)\" :shimmer=\"shimmer\" />\n </div>\n</template>\n<script setup lang=\"ts\">\nimport type { PropType } from \"vue\";\nimport { Skeleton } from \"@gospore/skeleton\";\ntype SkeletonDimension = string | number;\ndefineOptions({ name: \"CheckboxSkeleton\" });\ndefineProps({\n /** Sets the placeholder width for the label line. Numbers are converted to px. */\n labelWidth: { type: [String, Number] as PropType<SkeletonDimension>, default: \"10rem\" },\n /** Enables the animated shimmer effect for the placeholder. */\n shimmer: { type: Boolean, default: false },\n});\n</script>\n<style scoped lang=\"less\">\n.checkbox-skeleton {\n display: inline-flex;\n align-items: center;\n gap: var(--size-8);\n}\n</style>\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,42 +1,42 @@
1
1
  {
2
2
  "name": "@gospore/checkbox",
3
- "version": "1.0.65",
4
- "gitHead": "e6fe92d7b41871d7cf6ec867b6ecbaacc771cfb0",
3
+ "version": "1.0.67",
4
+ "gitHead": "a1341e1d497a4faf8ac9d4e1da61a050a3b31fb7",
5
5
  "description": "",
6
6
  "author": "Gospore",
7
7
  "files": [
8
8
  "dist"
9
9
  ],
10
10
  "type": "module",
11
- "main": "./dist/checkbox.cjs.js",
11
+ "main": "./dist/checkbox.cjs",
12
12
  "module": "./dist/checkbox.es.js",
13
13
  "types": "./dist/index.d.ts",
14
14
  "exports": {
15
15
  ".": {
16
16
  "import": "./dist/checkbox.es.js",
17
- "require": "./dist/checkbox.cjs.js",
17
+ "require": "./dist/checkbox.cjs",
18
18
  "types": "./dist/index.d.ts"
19
19
  },
20
20
  "./checkbox.css": "./dist/checkbox.css",
21
21
  "./umd": {
22
- "import": "./dist/checkbox.umd.js",
23
- "require": "./dist/checkbox.umd.js"
22
+ "import": "./dist/checkbox.umd.js"
24
23
  }
25
24
  },
26
25
  "scripts": {
27
26
  "build": "vite build"
28
27
  },
29
28
  "dependencies": {
30
- "@fortawesome/fontawesome-svg-core": "^7.3.0",
31
- "@fortawesome/free-solid-svg-icons": "^7.3.0",
32
- "@fortawesome/vue-fontawesome": "^3.3.1",
33
- "@gospore/skeleton": "^1.0.8",
29
+ "@fortawesome/fontawesome-svg-core": "^7.3.1",
30
+ "@fortawesome/free-solid-svg-icons": "^7.3.1",
31
+ "@fortawesome/vue-fontawesome": "^3.3.3",
32
+ "@gospore/skeleton": "^1.0.10",
34
33
  "lodash": "^4.18.1"
35
34
  },
36
35
  "devDependencies": {
37
- "@vitejs/plugin-vue": "^6.0.7",
36
+ "@vitejs/plugin-vue": "^6.0.8",
38
37
  "unplugin-vue-macros": "^2.14.5",
39
- "vite": "^8.1.4"
38
+ "vite": "^8.2.1",
39
+ "vue": "^3.5.41"
40
40
  },
41
41
  "peerDependencies": {
42
42
  "vue": "^3.4.20"
@@ -1,2 +0,0 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require("vue"),l=require("@fortawesome/vue-fontawesome"),u=require("@fortawesome/free-solid-svg-icons"),d=require("lodash/without.js");d=s(d,1);let f=require("@gospore/skeleton");function p(e){return e?m(e()):!1}function m(e){return Array.isArray(e)?e.some(m):typeof e==`string`?e.trim()!==``:typeof e==`number`?!0:!(0,c.isVNode)(e)||!h(e)?!1:e.type===c.Fragment?m(e.children):!0}function h(e){return e.type===c.Comment?!1:e.type===c.Text?typeof e.children==`string`&&e.children.trim()!==``:!0}var g=[`title`],_={class:`checkbox-input-container`},v=[`value`,`disabled`],y={key:0,class:`checkbox-label`},b={key:1,class:`checkbox-label`},x=(0,c.defineComponent)({name:`Checkbox`,inheritAttrs:!1,__name:`Checkbox`,props:{checked:{type:[Boolean,Array],default:!1},value:{type:[String,Object],default:``},label:{type:String,default:``},disabled:{type:Boolean,default:!1}},emits:[`update:checked`,`keyup`,`click`],setup(e,{emit:t}){let n=e,r=t,i=(0,c.useAttrs)(),a=(0,c.useSlots)(),o=(0,c.ref)(!1),s=(0,c.ref)(n.checked),f=(0,c.computed)(()=>p(a.default)),m=(0,c.computed)(()=>typeof s.value==`boolean`?s.value:s.value.includes(n.value)),h=(0,c.computed)(()=>{let{class:e,...t}=i;return Object.assign({},t,{onClick(e){n.disabled||r(`click`,e)},onKeyup(e){r(`keyup`,e),!n.disabled&&e.key===`Enter`&&(r(`click`,e),typeof s.value==`boolean`?s.value=!s.value:s.value.includes(n.value)?s.value=(0,d.default)(s.value,n.value):s.value=[...s.value,n.value])}})});return(0,c.watch)(()=>n.checked,e=>{s.value=e}),(0,c.watch)(()=>s.value,()=>{s.value!=n.checked&&r(`update:checked`,s.value)}),(t,n)=>((0,c.openBlock)(),(0,c.createElementBlock)(`label`,{class:(0,c.normalizeClass)([`checkbox`,{"checkbox-disabled":e.disabled},(0,c.unref)(i).class]),title:(0,c.unref)(i).title},[(0,c.createElementVNode)(`div`,_,[(0,c.createElementVNode)(`span`,{class:(0,c.normalizeClass)([`checkbox-input`,{"checkbox-checked":m.value,"checkbox-focused":o.value}])},[(0,c.createVNode)((0,c.unref)(l.FontAwesomeIcon),{class:`checkbox-input-icon`,icon:(0,c.unref)(u.faCheck),"aria-hidden":`true`},null,8,[`icon`]),(0,c.withDirectives)((0,c.createElementVNode)(`input`,(0,c.mergeProps)(h.value,{"onUpdate:modelValue":n[0]||=e=>s.value=e,type:`checkbox`,value:e.value,disabled:e.disabled,onFocus:n[1]||=e=>o.value=!0,onFocusout:n[2]||=e=>o.value=!1}),null,16,v),[[c.vModelCheckbox,s.value]])],2)]),f.value?((0,c.openBlock)(),(0,c.createElementBlock)(`div`,y,[(0,c.renderSlot)(t.$slots,`default`,{},void 0,!0)])):((0,c.openBlock)(),(0,c.createElementBlock)(`span`,b,(0,c.toDisplayString)(e.label),1))],10,g))}}),S=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},C=S(x,[[`__scopeId`,`data-v-eb918898`]]),w={class:`checkbox-skeleton`},T=S((0,c.defineComponent)({name:`CheckboxSkeleton`,__name:`CheckboxSkeleton`,props:{labelWidth:{type:[String,Number],default:`10rem`},shimmer:{type:Boolean,default:!1}},setup(e){return(t,n)=>((0,c.openBlock)(),(0,c.createElementBlock)(`div`,w,[(0,c.createVNode)((0,c.unref)(f.Skeleton),{width:`var(--size-20)`,height:`var(--size-20)`,radius:`var(--border-radius-regular)`,shimmer:e.shimmer},null,8,[`shimmer`]),(0,c.createVNode)((0,c.unref)(f.Skeleton),{width:e.labelWidth,height:`var(--size-16)`,shimmer:e.shimmer},null,8,[`width`,`shimmer`])]))}}),[[`__scopeId`,`data-v-472ff734`]]);exports.Checkbox=C,exports.CheckboxSkeleton=T;
2
- //# sourceMappingURL=checkbox.cjs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"checkbox.cjs.js","names":[],"sources":["../../shared/slot.ts","../src/Checkbox.vue","../src/Checkbox.vue","../src/CheckboxSkeleton.vue","../src/CheckboxSkeleton.vue"],"sourcesContent":["import { Comment, Fragment, isVNode, Text } from \"vue\";\nimport type { VNode, VNodeArrayChildren } from \"vue\";\n\ntype SlotFunction = () => unknown;\n\nexport function collectRenderableVNodes(children: VNodeArrayChildren | VNode[]): VNode[] {\n const nodes: VNode[] = [];\n\n children.forEach((child) => {\n if (Array.isArray(child)) {\n nodes.push(...collectRenderableVNodes(child));\n return;\n }\n if (!isVNode(child) || !isRenderableVNode(child)) {\n return;\n }\n if (child.type === Fragment && Array.isArray(child.children)) {\n nodes.push(...collectRenderableVNodes(child.children));\n return;\n }\n nodes.push(child);\n });\n\n return nodes;\n}\n\nexport function hasRenderableSlotContent(slot?: SlotFunction): boolean {\n if (!slot) {\n return false;\n }\n\n return isRenderableSlotChild(slot());\n}\n\nexport function collectSlotText(children: VNodeArrayChildren): string {\n return children\n .map((child) => {\n if (Array.isArray(child)) {\n return collectSlotText(child);\n }\n if (typeof child === \"string\" || typeof child === \"number\") {\n return String(child);\n }\n if (!isVNode(child) || child.type === Comment) {\n return \"\";\n }\n if (typeof child.children === \"string\") {\n return child.children;\n }\n if (Array.isArray(child.children)) {\n return collectSlotText(child.children);\n }\n return \"\";\n })\n .join(\"\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction isRenderableSlotChild(child: unknown): boolean {\n if (Array.isArray(child)) {\n return child.some(isRenderableSlotChild);\n }\n if (typeof child === \"string\") {\n return child.trim() !== \"\";\n }\n if (typeof child === \"number\") {\n return true;\n }\n if (!isVNode(child) || !isRenderableVNode(child)) {\n return false;\n }\n if (child.type === Fragment) {\n return isRenderableSlotChild(child.children);\n }\n return true;\n}\n\nfunction isRenderableVNode(node: VNode): boolean {\n if (node.type === Comment) {\n return false;\n }\n if (node.type === Text) {\n return typeof node.children === \"string\" && node.children.trim() !== \"\";\n }\n return true;\n}\n","<template>\n <label\n :class=\"['checkbox', { 'checkbox-disabled': disabled }, defaultAttrs.class]\"\n :title=\"defaultAttrs.title\"\n >\n <div class=\"checkbox-input-container\">\n <span\n :class=\"[\n 'checkbox-input',\n {\n 'checkbox-checked': isChecked,\n 'checkbox-focused': focused,\n },\n ]\"\n >\n <font-awesome-icon class=\"checkbox-input-icon\" :icon=\"faCheck\" aria-hidden=\"true\" />\n <input\n v-bind=\"attrs\"\n v-model=\"internalChecked\"\n type=\"checkbox\"\n :value=\"value\"\n :disabled=\"disabled\"\n @focus=\"focused = true\"\n @focusout=\"focused = false\"\n />\n </span>\n </div>\n <div v-if=\"hasDefaultContent\" class=\"checkbox-label\">\n <slot />\n </div>\n <span v-else class=\"checkbox-label\">{{ label }}</span>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { useAttrs, ref, computed, watch } from \"vue\";\nimport type { PropType } from \"vue\";\nimport { FontAwesomeIcon } from \"@fortawesome/vue-fontawesome\";\nimport { faCheck } from \"@fortawesome/free-solid-svg-icons\";\nimport without from \"lodash/without.js\";\nimport { hasRenderableSlotContent } from \"../../shared/slot\";\n\ntype CheckboxValue = string | Record<string, unknown>;\ntype CheckboxChecked = boolean | CheckboxValue[];\n\ndefineOptions({\n name: \"Checkbox\",\n inheritAttrs: false,\n});\nconst props = defineProps({\n /**\n * Controlled state. Pass a boolean for single checkboxes or an array for checkbox groups (the\n * component will push/pop value). Supports v-model:checked.\n */\n checked: {\n type: [Boolean, Array] as PropType<CheckboxChecked>,\n default: false,\n },\n /**\n * The value inserted or removed from the bound array when used in group mode. Ignored for\n * boolean usage.\n */\n value: {\n type: [String, Object] as PropType<CheckboxValue>,\n default: \"\",\n },\n /** Fallback label text when no default slot is provided. */\n label: {\n type: String,\n default: \"\",\n },\n /** Greys out the checkbox and prevents user interaction. */\n disabled: {\n type: Boolean,\n default: false,\n },\n});\nconst emit = defineEmits([\"update:checked\", \"keyup\", \"click\"]);\nconst defaultAttrs = useAttrs() as Record<string, unknown> & {\n class?: unknown;\n title?: string;\n};\nconst slots = defineSlots<{\n /** Custom label content rendered next to the checkbox input. */\n default?: () => unknown;\n}>();\nconst focused = ref(false);\nconst internalChecked = ref<CheckboxChecked>(props.checked);\nconst hasDefaultContent = computed(() => hasRenderableSlotContent(slots.default));\n\nconst isChecked = computed(() => {\n if (typeof internalChecked.value === \"boolean\") {\n return internalChecked.value;\n } else {\n return internalChecked.value.includes(props.value);\n }\n});\nconst attrs = computed(() => {\n const { class: omittedClass, ...inputAttrs } = defaultAttrs;\n void omittedClass;\n return Object.assign({}, inputAttrs, {\n onClick(event: MouseEvent) {\n if (!props.disabled) {\n emit(\"click\", event);\n }\n },\n // Pressing the enter key gets handled like a click.\n onKeyup(event: KeyboardEvent) {\n emit(\"keyup\", event);\n if (props.disabled) {\n return;\n }\n if (event.key === \"Enter\") {\n emit(\"click\", event);\n if (typeof internalChecked.value == \"boolean\") {\n internalChecked.value = !internalChecked.value;\n } else {\n if (internalChecked.value.includes(props.value)) {\n internalChecked.value = without(internalChecked.value, props.value);\n } else {\n internalChecked.value = [...internalChecked.value, props.value];\n }\n }\n }\n },\n });\n});\n\nwatch(\n () => props.checked,\n (checked) => {\n internalChecked.value = checked;\n },\n);\nwatch(\n () => internalChecked.value,\n () => {\n // Only emit the update:checked event if the mutation came from within the checkbox component.\n if (internalChecked.value != props.checked) {\n emit(\"update:checked\", internalChecked.value);\n }\n },\n);\n</script>\n\n<style>\n@import \"theme.css\";\n</style>\n\n<style lang=\"less\" scoped>\n.checkbox {\n position: relative;\n display: flex;\n padding: var(--checkbox-padding);\n\n .checkbox-input-container {\n padding: 5px;\n }\n .checkbox-input {\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--checkbox-height);\n width: var(--checkbox-width);\n box-sizing: border-box;\n border-radius: var(--checkbox-border-radius);\n border: var(--checkbox-border-width) solid;\n background-color: var(--checkbox-background-default-default-light);\n color: var(--checkbox-color-default-default-light);\n border-color: var(--checkbox-border-color-default-default-light);\n transition: var(--checkbox-transition);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-light);\n color: var(--checkbox-color-default-hover-light);\n border-color: var(--checkbox-border-color-default-hover-light);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-light);\n color: var(--checkbox-color-default-active-light);\n border-color: var(--checkbox-border-color-default-active-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-light);\n color: var(--checkbox-color-checked-default-light);\n border-color: var(--checkbox-border-color-checked-default-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-light);\n color: var(--checkbox-color-checked-hover-light);\n border-color: var(--checkbox-border-color-checked-hover-light);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-light);\n color: var(--checkbox-color-checked-active-light);\n border-color: var(--checkbox-border-color-checked-active-light);\n }\n}\n.checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-light);\n cursor: not-allowed;\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n}\n.checkbox-input-icon {\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n padding: 1px;\n}\n.checkbox-label {\n padding: var(--checkbox-label-padding);\n line-height: var(--checkbox-line-height);\n}\ninput {\n margin: 0;\n opacity: 0;\n position: absolute;\n pointer-events: none;\n}\n[data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-light) !important;\n}\n\n[dark-mode=\"true\"] {\n .checkbox {\n .checkbox-input {\n background-color: var(--checkbox-background-default-default-dark);\n color: var(--checkbox-color-default-default-dark);\n border-color: var(--checkbox-border-color-default-default-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-dark);\n color: var(--checkbox-color-default-hover-dark);\n border-color: var(--checkbox-border-color-default-hover-dark);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-dark);\n color: var(--checkbox-color-default-active-dark);\n border-color: var(--checkbox-border-color-default-active-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-dark);\n color: var(--checkbox-color-checked-default-dark);\n border-color: var(--checkbox-border-color-checked-default-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-dark);\n color: var(--checkbox-color-checked-hover-dark);\n border-color: var(--checkbox-border-color-checked-hover-dark);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-dark);\n color: var(--checkbox-color-checked-active-dark);\n border-color: var(--checkbox-border-color-checked-active-dark);\n }\n }\n .checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-dark);\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n }\n\n [data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-dark) !important;\n }\n}\n</style>\n","<template>\n <label\n :class=\"['checkbox', { 'checkbox-disabled': disabled }, defaultAttrs.class]\"\n :title=\"defaultAttrs.title\"\n >\n <div class=\"checkbox-input-container\">\n <span\n :class=\"[\n 'checkbox-input',\n {\n 'checkbox-checked': isChecked,\n 'checkbox-focused': focused,\n },\n ]\"\n >\n <font-awesome-icon class=\"checkbox-input-icon\" :icon=\"faCheck\" aria-hidden=\"true\" />\n <input\n v-bind=\"attrs\"\n v-model=\"internalChecked\"\n type=\"checkbox\"\n :value=\"value\"\n :disabled=\"disabled\"\n @focus=\"focused = true\"\n @focusout=\"focused = false\"\n />\n </span>\n </div>\n <div v-if=\"hasDefaultContent\" class=\"checkbox-label\">\n <slot />\n </div>\n <span v-else class=\"checkbox-label\">{{ label }}</span>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { useAttrs, ref, computed, watch } from \"vue\";\nimport type { PropType } from \"vue\";\nimport { FontAwesomeIcon } from \"@fortawesome/vue-fontawesome\";\nimport { faCheck } from \"@fortawesome/free-solid-svg-icons\";\nimport without from \"lodash/without.js\";\nimport { hasRenderableSlotContent } from \"../../shared/slot\";\n\ntype CheckboxValue = string | Record<string, unknown>;\ntype CheckboxChecked = boolean | CheckboxValue[];\n\ndefineOptions({\n name: \"Checkbox\",\n inheritAttrs: false,\n});\nconst props = defineProps({\n /**\n * Controlled state. Pass a boolean for single checkboxes or an array for checkbox groups (the\n * component will push/pop value). Supports v-model:checked.\n */\n checked: {\n type: [Boolean, Array] as PropType<CheckboxChecked>,\n default: false,\n },\n /**\n * The value inserted or removed from the bound array when used in group mode. Ignored for\n * boolean usage.\n */\n value: {\n type: [String, Object] as PropType<CheckboxValue>,\n default: \"\",\n },\n /** Fallback label text when no default slot is provided. */\n label: {\n type: String,\n default: \"\",\n },\n /** Greys out the checkbox and prevents user interaction. */\n disabled: {\n type: Boolean,\n default: false,\n },\n});\nconst emit = defineEmits<{\n \"update:checked\": [value: CheckboxChecked];\n keyup: [event: KeyboardEvent];\n click: [event: MouseEvent | KeyboardEvent];\n}>();\nconst defaultAttrs = useAttrs() as Record<string, unknown> & {\n class?: unknown;\n title?: string;\n};\nconst slots = defineSlots<{\n /** Custom label content rendered next to the checkbox input. */\n default?: () => unknown;\n}>();\nconst focused = ref(false);\nconst internalChecked = ref<CheckboxChecked>(props.checked);\nconst hasDefaultContent = computed(() => hasRenderableSlotContent(slots.default));\n\nconst isChecked = computed(() => {\n if (typeof internalChecked.value === \"boolean\") {\n return internalChecked.value;\n } else {\n return internalChecked.value.includes(props.value);\n }\n});\nconst attrs = computed(() => {\n const { class: omittedClass, ...inputAttrs } = defaultAttrs;\n void omittedClass;\n return Object.assign({}, inputAttrs, {\n onClick(event: MouseEvent) {\n if (!props.disabled) {\n emit(\"click\", event);\n }\n },\n // Pressing the enter key gets handled like a click.\n onKeyup(event: KeyboardEvent) {\n emit(\"keyup\", event);\n if (props.disabled) {\n return;\n }\n if (event.key === \"Enter\") {\n emit(\"click\", event);\n if (typeof internalChecked.value == \"boolean\") {\n internalChecked.value = !internalChecked.value;\n } else {\n if (internalChecked.value.includes(props.value)) {\n internalChecked.value = without(internalChecked.value, props.value);\n } else {\n internalChecked.value = [...internalChecked.value, props.value];\n }\n }\n }\n },\n });\n});\n\nwatch(\n () => props.checked,\n (checked) => {\n internalChecked.value = checked;\n },\n);\nwatch(\n () => internalChecked.value,\n () => {\n // Only emit the update:checked event if the mutation came from within the checkbox component.\n if (internalChecked.value != props.checked) {\n emit(\"update:checked\", internalChecked.value);\n }\n },\n);\n</script>\n\n<style>\n@import \"theme.css\";\n</style>\n\n<style lang=\"less\" scoped>\n.checkbox {\n position: relative;\n display: flex;\n padding: var(--checkbox-padding);\n\n .checkbox-input-container {\n padding: 5px;\n }\n .checkbox-input {\n display: flex;\n align-items: center;\n justify-content: center;\n height: var(--checkbox-height);\n width: var(--checkbox-width);\n box-sizing: border-box;\n border-radius: var(--checkbox-border-radius);\n border: var(--checkbox-border-width) solid;\n background-color: var(--checkbox-background-default-default-light);\n color: var(--checkbox-color-default-default-light);\n border-color: var(--checkbox-border-color-default-default-light);\n transition: var(--checkbox-transition);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-light);\n color: var(--checkbox-color-default-hover-light);\n border-color: var(--checkbox-border-color-default-hover-light);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-light);\n color: var(--checkbox-color-default-active-light);\n border-color: var(--checkbox-border-color-default-active-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-light);\n color: var(--checkbox-color-checked-default-light);\n border-color: var(--checkbox-border-color-checked-default-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-light);\n color: var(--checkbox-color-checked-hover-light);\n border-color: var(--checkbox-border-color-checked-hover-light);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-light);\n color: var(--checkbox-color-checked-active-light);\n border-color: var(--checkbox-border-color-checked-active-light);\n }\n}\n.checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-light);\n cursor: not-allowed;\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-light);\n color: var(--checkbox-color-default-disabled-light);\n border-color: var(--checkbox-border-color-default-disabled-light);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-light);\n color: var(--checkbox-color-checked-disabled-light);\n border-color: var(--checkbox-border-color-checked-disabled-light);\n }\n}\n.checkbox-input-icon {\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n padding: 1px;\n}\n.checkbox-label {\n padding: var(--checkbox-label-padding);\n line-height: var(--checkbox-line-height);\n}\ninput {\n margin: 0;\n opacity: 0;\n position: absolute;\n pointer-events: none;\n}\n[data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-light) !important;\n}\n\n[dark-mode=\"true\"] {\n .checkbox {\n .checkbox-input {\n background-color: var(--checkbox-background-default-default-dark);\n color: var(--checkbox-color-default-default-dark);\n border-color: var(--checkbox-border-color-default-default-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-hover-dark);\n color: var(--checkbox-color-default-hover-dark);\n border-color: var(--checkbox-border-color-default-hover-dark);\n }\n &:active .checkbox-input {\n background-color: var(--checkbox-background-default-active-dark);\n color: var(--checkbox-color-default-active-dark);\n border-color: var(--checkbox-border-color-default-active-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-default-dark);\n color: var(--checkbox-color-checked-default-dark);\n border-color: var(--checkbox-border-color-checked-default-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-hover-dark);\n color: var(--checkbox-color-checked-hover-dark);\n border-color: var(--checkbox-border-color-checked-hover-dark);\n }\n &:active .checkbox-checked {\n background-color: var(--checkbox-background-checked-active-dark);\n color: var(--checkbox-color-checked-active-dark);\n border-color: var(--checkbox-border-color-checked-active-dark);\n }\n }\n .checkbox-disabled {\n color: var(--checkbox-color-checked-disabled-dark);\n\n .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n &:hover .checkbox-input {\n background-color: var(--checkbox-background-default-disabled-dark);\n color: var(--checkbox-color-default-disabled-dark);\n border-color: var(--checkbox-border-color-default-disabled-dark);\n }\n\n .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n &:hover .checkbox-checked {\n background-color: var(--checkbox-background-checked-disabled-dark);\n color: var(--checkbox-color-checked-disabled-dark);\n border-color: var(--checkbox-border-color-checked-disabled-dark);\n }\n }\n\n [data-whatinput=\"keyboard\"] .checkbox-focused {\n border-color: var(--checkbox-focus-outline-color-dark) !important;\n }\n}\n</style>\n","<template>\n <div class=\"checkbox-skeleton\">\n <Skeleton\n width=\"var(--size-20)\"\n height=\"var(--size-20)\"\n radius=\"var(--border-radius-regular)\"\n :shimmer=\"shimmer\"\n />\n <Skeleton :width=\"labelWidth\" height=\"var(--size-16)\" :shimmer=\"shimmer\" />\n </div>\n</template>\n<script setup lang=\"ts\">\nimport type { PropType } from \"vue\";\nimport { Skeleton } from \"@gospore/skeleton\";\ntype SkeletonDimension = string | number;\ndefineOptions({ name: \"CheckboxSkeleton\" });\ndefineProps({\n /** Sets the placeholder width for the label line. Numbers are converted to px. */\n labelWidth: { type: [String, Number] as PropType<SkeletonDimension>, default: \"10rem\" },\n /** Enables the animated shimmer effect for the placeholder. */\n shimmer: { type: Boolean, default: false },\n});\n</script>\n<style scoped lang=\"less\">\n.checkbox-skeleton {\n display: inline-flex;\n align-items: center;\n gap: var(--size-8);\n}\n</style>\n","<template>\n <div class=\"checkbox-skeleton\">\n <Skeleton\n width=\"var(--size-20)\"\n height=\"var(--size-20)\"\n radius=\"var(--border-radius-regular)\"\n :shimmer=\"shimmer\"\n />\n <Skeleton :width=\"labelWidth\" height=\"var(--size-16)\" :shimmer=\"shimmer\" />\n </div>\n</template>\n<script setup lang=\"ts\">\nimport type { PropType } from \"vue\";\nimport { Skeleton } from \"@gospore/skeleton\";\ntype SkeletonDimension = string | number;\ndefineOptions({ name: \"CheckboxSkeleton\" });\ndefineProps({\n /** Sets the placeholder width for the label line. Numbers are converted to px. */\n labelWidth: { type: [String, Number] as PropType<SkeletonDimension>, default: \"10rem\" },\n /** Enables the animated shimmer effect for the placeholder. */\n shimmer: { type: Boolean, default: false },\n});\n</script>\n<style scoped lang=\"less\">\n.checkbox-skeleton {\n display: inline-flex;\n align-items: center;\n gap: var(--size-8);\n}\n</style>\n"],"mappings":"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"}