@rotki/ui-library 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/dist/components/accordions/accordion/RuiAccordion.js.map +1 -1
  2. package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js +13 -2
  3. package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
  4. package/dist/components/alerts/RuiAlert.vue.d.ts +2 -2
  5. package/dist/components/buttons/button/RuiButton.js.map +1 -1
  6. package/dist/components/buttons/button/RuiButton.vue.d.ts +7 -1
  7. package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js +4 -2
  8. package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  9. package/dist/components/buttons/button/button-props.d.ts +3 -0
  10. package/dist/components/buttons/button/button-props.js +2 -1
  11. package/dist/components/buttons/button/button-props.js.map +1 -1
  12. package/dist/components/buttons/button/button-styles.d.ts +75 -0
  13. package/dist/components/buttons/button/button-styles.js +135 -4
  14. package/dist/components/buttons/button/button-styles.js.map +1 -1
  15. package/dist/components/cards/RuiCard.js.map +1 -1
  16. package/dist/components/cards/RuiCard.vue.d.ts +6 -0
  17. package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js +14 -2
  18. package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/components/chips/RuiChip.js.map +1 -1
  20. package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js +14 -0
  21. package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  22. package/dist/components/chips/chip-props.d.ts +2 -0
  23. package/dist/components/chips/chip-props.js +3 -0
  24. package/dist/components/chips/chip-props.js.map +1 -1
  25. package/dist/components/color-picker/RuiColorInput.js.map +1 -1
  26. package/dist/components/color-picker/RuiColorInput.vue_vue_type_script_setup_true_lang.js +2 -2
  27. package/dist/components/color-picker/RuiColorInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  28. package/dist/components/date-time-picker/RuiDateTimePicker.js.map +1 -1
  29. package/dist/components/date-time-picker/RuiDateTimePicker.vue.d.ts +4 -0
  30. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js +6 -2
  31. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  32. package/dist/components/date-time-picker/RuiDateTimePickerMenu.js.map +1 -1
  33. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js +1 -1
  34. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  35. package/dist/components/date-time-picker/RuiTimezoneSelect.js.map +1 -1
  36. package/dist/components/date-time-picker/RuiTimezoneSelect.vue.d.ts +4 -0
  37. package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js +3 -2
  38. package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  39. package/dist/components/forms/auto-complete/RuiAutoComplete.js.map +1 -1
  40. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js +6 -2
  41. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  42. package/dist/components/forms/auto-complete/auto-complete-props.d.ts +4 -0
  43. package/dist/components/forms/category-picker/RuiCategoryPicker.js.map +1 -1
  44. package/dist/components/forms/category-picker/RuiCategoryPicker.vue.d.ts +4 -1
  45. package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js +7 -4
  46. package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  47. package/dist/components/forms/check-control-styles.d.ts +27 -0
  48. package/dist/components/forms/check-control-styles.js +26 -1
  49. package/dist/components/forms/check-control-styles.js.map +1 -1
  50. package/dist/components/forms/checkbox/RuiCheckbox.js.map +1 -1
  51. package/dist/components/forms/checkbox/RuiCheckbox.vue.d.ts +6 -0
  52. package/dist/components/forms/checkbox/RuiCheckbox.vue_vue_type_script_setup_true_lang.js +14 -4
  53. package/dist/components/forms/checkbox/RuiCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  54. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.js.map +1 -1
  55. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue.d.ts +4 -0
  56. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js +7 -2
  57. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  58. package/dist/components/forms/field-defaults/RuiFieldDefaults.js.map +1 -1
  59. package/dist/components/forms/field-defaults/RuiFieldDefaults.vue.d.ts +3 -0
  60. package/dist/components/forms/field-defaults/RuiFieldDefaults.vue_vue_type_script_setup_true_lang.js +8 -2
  61. package/dist/components/forms/field-defaults/RuiFieldDefaults.vue_vue_type_script_setup_true_lang.js.map +1 -1
  62. package/dist/components/forms/file-upload/RuiFileUpload.js.map +1 -1
  63. package/dist/components/forms/file-upload/RuiFileUpload.vue.d.ts +4 -1
  64. package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js +10 -3
  65. package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js.map +1 -1
  66. package/dist/components/forms/radio-button/radio/RuiRadio.js.map +1 -1
  67. package/dist/components/forms/radio-button/radio/RuiRadio.vue.d.ts +6 -0
  68. package/dist/components/forms/radio-button/radio/RuiRadio.vue_vue_type_script_setup_true_lang.js +14 -3
  69. package/dist/components/forms/radio-button/radio/RuiRadio.vue_vue_type_script_setup_true_lang.js.map +1 -1
  70. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.js.map +1 -1
  71. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue.d.ts +4 -0
  72. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue_vue_type_script_setup_true_lang.js +7 -2
  73. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  74. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.js.map +1 -1
  75. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue_vue_type_script_setup_true_lang.js +3 -2
  76. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  77. package/dist/components/forms/select/RuiMenuSelect.js.map +1 -1
  78. package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +4 -0
  79. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js +6 -2
  80. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  81. package/dist/components/forms/slider/RuiSlider.js.map +1 -1
  82. package/dist/components/forms/slider/RuiSlider.vue.d.ts +4 -0
  83. package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js +6 -3
  84. package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  85. package/dist/components/forms/switch/RuiSwitch.js.map +1 -1
  86. package/dist/components/forms/switch/RuiSwitch.vue.d.ts +6 -0
  87. package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js +25 -5
  88. package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  89. package/dist/components/forms/text-area/RuiTextArea.js.map +1 -1
  90. package/dist/components/forms/text-area/RuiTextArea.vue.d.ts +4 -0
  91. package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js +6 -4
  92. package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  93. package/dist/components/forms/text-area/text-area-styles.d.ts +0 -1
  94. package/dist/components/forms/text-area/text-area-styles.js +0 -1
  95. package/dist/components/forms/text-area/text-area-styles.js.map +1 -1
  96. package/dist/components/forms/text-field/RuiTextField.js.map +1 -1
  97. package/dist/components/forms/text-field/RuiTextField.vue.d.ts +6 -2
  98. package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js +6 -4
  99. package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  100. package/dist/components/forms/text-field/text-field-styles.d.ts +0 -1
  101. package/dist/components/forms/text-field/text-field-styles.js +0 -1
  102. package/dist/components/forms/text-field/text-field-styles.js.map +1 -1
  103. package/dist/components/helpers/RuiFormTextDetail.js.map +1 -1
  104. package/dist/components/helpers/RuiFormTextDetail.vue.d.ts +14 -0
  105. package/dist/components/helpers/RuiFormTextDetail.vue_vue_type_script_setup_true_lang.js +41 -11
  106. package/dist/components/helpers/RuiFormTextDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
  107. package/dist/components/loaders/RuiSkeletonBase.js.map +1 -1
  108. package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js.map +1 -1
  109. package/dist/components/overlays/menu/RuiMenu.js.map +1 -1
  110. package/dist/components/overlays/menu/RuiMenu.vue.d.ts +3 -0
  111. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js +9 -1
  112. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  113. package/dist/components/tables/RuiDataTable.js.map +1 -1
  114. package/dist/components/tables/RuiDataTable.vue.d.ts +4 -0
  115. package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js +7 -1
  116. package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  117. package/dist/components/tables/RuiExpandButton.js.map +1 -1
  118. package/dist/components/tables/RuiExpandButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  119. package/dist/components/tables/RuiTableHead.js.map +1 -1
  120. package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js +1 -1
  121. package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js.map +1 -1
  122. package/dist/components/tables/RuiTablePagination.js.map +1 -1
  123. package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js +3 -3
  124. package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  125. package/dist/components/tables/data-table/RuiDataTableAppendRow.js.map +1 -1
  126. package/dist/components/tables/data-table/RuiDataTableAppendRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  127. package/dist/components/tables/data-table/RuiDataTableRow.js.map +1 -1
  128. package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js +2 -2
  129. package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  130. package/dist/components/tables/data-table-styles.d.ts +6 -0
  131. package/dist/components/tables/data-table-styles.js +11 -3
  132. package/dist/components/tables/data-table-styles.js.map +1 -1
  133. package/dist/components/tabs/tab-items/RuiTabItems.js.map +1 -1
  134. package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js +9 -2
  135. package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js.map +1 -1
  136. package/dist/composables/clip-while-resizing.d.ts +15 -0
  137. package/dist/composables/clip-while-resizing.js +46 -0
  138. package/dist/composables/clip-while-resizing.js.map +1 -0
  139. package/dist/composables/defaults/field.d.ts +19 -3
  140. package/dist/composables/defaults/field.js +32 -6
  141. package/dist/composables/defaults/field.js.map +1 -1
  142. package/dist/composables/sticky-blocker.d.ts +20 -0
  143. package/dist/composables/sticky-blocker.js +62 -0
  144. package/dist/composables/sticky-blocker.js.map +1 -0
  145. package/dist/index.d.ts +6 -2
  146. package/dist/index.js.map +1 -1
  147. package/dist/style.css +275 -0
  148. package/dist/utils/development.d.ts +6 -0
  149. package/dist/utils/development.js +17 -0
  150. package/dist/utils/development.js.map +1 -0
  151. package/dist/utils/form-text-detail.d.ts +15 -0
  152. package/dist/utils/form-text-detail.js +11 -1
  153. package/dist/utils/form-text-detail.js.map +1 -1
  154. package/dist/web-types.json +232 -3
  155. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"RuiAccordion.js","names":["_sfc_main"],"sources":["../../../../src/components/accordions/accordion/RuiAccordion.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { VueClassValue } from '@/types/class-value';\nimport Icon from '@/components/icons/RuiIcon.vue';\nimport { cn, tv } from '@/utils/tv';\n\nexport interface RuiAccordionClassNames {\n root?: VueClassValue;\n header?: VueClassValue;\n content?: VueClassValue;\n}\n\nexport interface AccordionProps {\n open?: boolean;\n eager?: boolean;\n headerGrow?: boolean;\n classNames?: RuiAccordionClassNames;\n}\n\ndefineOptions({\n name: 'RuiAccordion',\n inheritAttrs: false,\n});\n\nconst {\n open = false,\n eager = false,\n headerGrow = false,\n classNames,\n} = defineProps<AccordionProps>();\n\nconst emit = defineEmits<{\n click: [];\n}>();\n\ndefineSlots<{\n header?: (props: { open: boolean }) => any;\n default?: () => any;\n}>();\n\nconst inner = useTemplateRef<HTMLDivElement>('inner');\n\nconst triggerId = useId();\nconst contentId = useId();\nconst { height: innerHeight } = useElementSize(inner);\n\nconst contentHeight = computed<string>(() => (open ? `${get(innerHeight)}px` : '0px'));\n\nfunction toggle(): void {\n emit('click');\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n toggle();\n }\n}\n\nconst rootStyle = tv({ base: 'flex flex-col items-start' });\n</script>\n\n<template>\n <div\n :class=\"rootStyle({ class: cn(classNames?.root ?? $attrs.class) })\"\n :data-state=\"open ? 'open' : 'closed'\"\n data-accordion\n v-bind=\"{ ...$attrs, class: undefined }\"\n >\n <!-- rounded only while focused: a permanent radius bent any border an app draws on the header -->\n <div\n v-if=\"$slots.header\"\n :id=\"triggerId\"\n class=\"group flex gap-2 items-center cursor-pointer outline-hidden focus-visible:focus-ring focus-visible:rounded-rui-control\"\n :class=\"[classNames?.header, { 'w-full': headerGrow }]\"\n role=\"button\"\n tabindex=\"0\"\n :aria-expanded=\"open\"\n :aria-controls=\"contentId\"\n data-accordion-trigger\n @click=\"toggle()\"\n @keydown=\"onKeydown($event)\"\n >\n <div :class=\"{ grow: headerGrow }\">\n <slot\n name=\"header\"\n :open=\"open\"\n />\n </div>\n <Icon\n class=\"shrink-0 text-rui-text-secondary transition-[rotate,color] duration-200 ease-out group-hover:text-rui-text motion-reduce:transition-none\"\n :class=\"{ '-rotate-180': open }\"\n name=\"lu-chevron-down\"\n :size=\"16\"\n />\n </div>\n <div\n v-if=\"open || eager\"\n :id=\"contentId\"\n class=\"grow transition-[height] duration-200 ease-out overflow-hidden w-full motion-reduce:transition-none\"\n :class=\"classNames?.content\"\n :style=\"{ height: contentHeight }\"\n role=\"region\"\n :aria-labelledby=\"triggerId\"\n data-accordion-content\n >\n <div ref=\"inner\">\n <slot name=\"default\" />\n </div>\n </div>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"RuiAccordion.js","names":["_sfc_main"],"sources":["../../../../src/components/accordions/accordion/RuiAccordion.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { VueClassValue } from '@/types/class-value';\nimport Icon from '@/components/icons/RuiIcon.vue';\nimport { useClipWhileResizing } from '@/composables/clip-while-resizing';\nimport { cn, tv } from '@/utils/tv';\n\nexport interface RuiAccordionClassNames {\n root?: VueClassValue;\n header?: VueClassValue;\n content?: VueClassValue;\n}\n\nexport interface AccordionProps {\n open?: boolean;\n eager?: boolean;\n headerGrow?: boolean;\n classNames?: RuiAccordionClassNames;\n}\n\ndefineOptions({\n name: 'RuiAccordion',\n inheritAttrs: false,\n});\n\nconst {\n open = false,\n eager = false,\n headerGrow = false,\n classNames,\n} = defineProps<AccordionProps>();\n\nconst emit = defineEmits<{\n click: [];\n}>();\n\ndefineSlots<{\n header?: (props: { open: boolean }) => any;\n default?: () => any;\n}>();\n\nconst inner = useTemplateRef<HTMLDivElement>('inner');\nconst content = useTemplateRef<HTMLDivElement>('content');\n\nconst triggerId = useId();\nconst contentId = useId();\nconst { height: innerHeight } = useElementSize(inner);\n\nconst contentHeight = computed<string>(() => (open ? `${get(innerHeight)}px` : '0px'));\n\nconst resizing = useClipWhileResizing(content, contentHeight);\n\n// a closed `eager` panel keeps its content at height 0, so it clips; an open one only while it resizes, so sticky content works\nconst clipped = computed<boolean>(() => !open || get(resizing));\n\nfunction toggle(): void {\n emit('click');\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n toggle();\n }\n}\n\nconst rootStyle = tv({ base: 'flex flex-col items-start' });\n</script>\n\n<template>\n <div\n :class=\"rootStyle({ class: cn(classNames?.root ?? $attrs.class) })\"\n :data-state=\"open ? 'open' : 'closed'\"\n data-accordion\n v-bind=\"{ ...$attrs, class: undefined }\"\n >\n <!-- rounded only while focused: a permanent radius bent any border an app draws on the header -->\n <div\n v-if=\"$slots.header\"\n :id=\"triggerId\"\n class=\"group flex gap-2 items-center cursor-pointer outline-hidden focus-visible:focus-ring focus-visible:rounded-rui-control\"\n :class=\"[classNames?.header, { 'w-full': headerGrow }]\"\n role=\"button\"\n tabindex=\"0\"\n :aria-expanded=\"open\"\n :aria-controls=\"contentId\"\n data-accordion-trigger\n @click=\"toggle()\"\n @keydown=\"onKeydown($event)\"\n >\n <div :class=\"{ grow: headerGrow }\">\n <slot\n name=\"header\"\n :open=\"open\"\n />\n </div>\n <Icon\n class=\"shrink-0 text-rui-text-secondary transition-[rotate,color] duration-200 ease-out group-hover:text-rui-text motion-reduce:transition-none\"\n :class=\"{ '-rotate-180': open }\"\n name=\"lu-chevron-down\"\n :size=\"16\"\n />\n </div>\n <div\n v-if=\"open || eager\"\n :id=\"contentId\"\n ref=\"content\"\n class=\"grow transition-[height] duration-200 ease-out w-full motion-reduce:transition-none\"\n :class=\"[{ 'overflow-hidden': clipped }, classNames?.content]\"\n :data-clipped=\"clipped || undefined\"\n :style=\"{ height: contentHeight }\"\n role=\"region\"\n :aria-labelledby=\"triggerId\"\n data-accordion-content\n >\n <div ref=\"inner\">\n <slot name=\"default\" />\n </div>\n </div>\n </div>\n</template>\n"],"mappings":""}
@@ -2,6 +2,7 @@ import { get } from "../../../vendor/@vueuse/shared/dist/index.js";
2
2
  import { useElementSize } from "../../../vendor/@vueuse/core/dist/index.js";
3
3
  import { cn, tv } from "../../../utils/tv.js";
4
4
  import RuiIcon_default from "../../icons/RuiIcon.js";
5
+ import { useClipWhileResizing } from "../../../composables/clip-while-resizing.js";
5
6
  import { computed, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, mergeProps, normalizeClass, normalizeStyle, openBlock, renderSlot, unref, useId, useTemplateRef } from "vue";
6
7
  //#region src/components/accordions/accordion/RuiAccordion.vue?vue&type=script&setup=true&lang.ts
7
8
  var _hoisted_1 = ["data-state"];
@@ -10,7 +11,11 @@ var _hoisted_2 = [
10
11
  "aria-expanded",
11
12
  "aria-controls"
12
13
  ];
13
- var _hoisted_3 = ["id", "aria-labelledby"];
14
+ var _hoisted_3 = [
15
+ "id",
16
+ "data-clipped",
17
+ "aria-labelledby"
18
+ ];
14
19
  var RuiAccordion_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
15
20
  name: "RuiAccordion",
16
21
  inheritAttrs: false,
@@ -34,10 +39,13 @@ var RuiAccordion_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
34
39
  setup(__props, { emit: __emit }) {
35
40
  const emit = __emit;
36
41
  const inner = useTemplateRef("inner");
42
+ const content = useTemplateRef("content");
37
43
  const triggerId = useId();
38
44
  const contentId = useId();
39
45
  const { height: innerHeight } = useElementSize(inner);
40
46
  const contentHeight = computed(() => __props.open ? `${get(innerHeight)}px` : "0px");
47
+ const resizing = useClipWhileResizing(content, contentHeight);
48
+ const clipped = computed(() => !__props.open || get(resizing));
41
49
  function toggle() {
42
50
  emit("click");
43
51
  }
@@ -74,7 +82,10 @@ var RuiAccordion_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
74
82
  }, null, 8, ["class"])], 42, _hoisted_2)) : createCommentVNode("", true), __props.open || __props.eager ? (openBlock(), createElementBlock("div", {
75
83
  key: 1,
76
84
  id: unref(contentId),
77
- class: normalizeClass(["grow transition-[height] duration-200 ease-out overflow-hidden w-full motion-reduce:transition-none", __props.classNames?.content]),
85
+ ref_key: "content",
86
+ ref: content,
87
+ class: normalizeClass(["grow transition-[height] duration-200 ease-out w-full motion-reduce:transition-none", [{ "overflow-hidden": unref(clipped) }, __props.classNames?.content]]),
88
+ "data-clipped": unref(clipped) || void 0,
78
89
  style: normalizeStyle({ height: unref(contentHeight) }),
79
90
  role: "region",
80
91
  "aria-labelledby": unref(triggerId),
@@ -1 +1 @@
1
- {"version":3,"file":"RuiAccordion.vue_vue_type_script_setup_true_lang.js","names":["$attrs","$slots","_openBlock","_createElementBlock","_mergeProps","_unref","_normalizeClass","_createElementVNode","_renderSlot","_createVNode","Icon","_createCommentVNode","_normalizeStyle"],"sources":["../../../../src/components/accordions/accordion/RuiAccordion.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { VueClassValue } from '@/types/class-value';\nimport Icon from '@/components/icons/RuiIcon.vue';\nimport { cn, tv } from '@/utils/tv';\n\nexport interface RuiAccordionClassNames {\n root?: VueClassValue;\n header?: VueClassValue;\n content?: VueClassValue;\n}\n\nexport interface AccordionProps {\n open?: boolean;\n eager?: boolean;\n headerGrow?: boolean;\n classNames?: RuiAccordionClassNames;\n}\n\ndefineOptions({\n name: 'RuiAccordion',\n inheritAttrs: false,\n});\n\nconst {\n open = false,\n eager = false,\n headerGrow = false,\n classNames,\n} = defineProps<AccordionProps>();\n\nconst emit = defineEmits<{\n click: [];\n}>();\n\ndefineSlots<{\n header?: (props: { open: boolean }) => any;\n default?: () => any;\n}>();\n\nconst inner = useTemplateRef<HTMLDivElement>('inner');\n\nconst triggerId = useId();\nconst contentId = useId();\nconst { height: innerHeight } = useElementSize(inner);\n\nconst contentHeight = computed<string>(() => (open ? `${get(innerHeight)}px` : '0px'));\n\nfunction toggle(): void {\n emit('click');\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n toggle();\n }\n}\n\nconst rootStyle = tv({ base: 'flex flex-col items-start' });\n</script>\n\n<template>\n <div\n :class=\"rootStyle({ class: cn(classNames?.root ?? $attrs.class) })\"\n :data-state=\"open ? 'open' : 'closed'\"\n data-accordion\n v-bind=\"{ ...$attrs, class: undefined }\"\n >\n <!-- rounded only while focused: a permanent radius bent any border an app draws on the header -->\n <div\n v-if=\"$slots.header\"\n :id=\"triggerId\"\n class=\"group flex gap-2 items-center cursor-pointer outline-hidden focus-visible:focus-ring focus-visible:rounded-rui-control\"\n :class=\"[classNames?.header, { 'w-full': headerGrow }]\"\n role=\"button\"\n tabindex=\"0\"\n :aria-expanded=\"open\"\n :aria-controls=\"contentId\"\n data-accordion-trigger\n @click=\"toggle()\"\n @keydown=\"onKeydown($event)\"\n >\n <div :class=\"{ grow: headerGrow }\">\n <slot\n name=\"header\"\n :open=\"open\"\n />\n </div>\n <Icon\n class=\"shrink-0 text-rui-text-secondary transition-[rotate,color] duration-200 ease-out group-hover:text-rui-text motion-reduce:transition-none\"\n :class=\"{ '-rotate-180': open }\"\n name=\"lu-chevron-down\"\n :size=\"16\"\n />\n </div>\n <div\n v-if=\"open || eager\"\n :id=\"contentId\"\n class=\"grow transition-[height] duration-200 ease-out overflow-hidden w-full motion-reduce:transition-none\"\n :class=\"classNames?.content\"\n :style=\"{ height: contentHeight }\"\n role=\"region\"\n :aria-labelledby=\"triggerId\"\n data-accordion-content\n >\n <div ref=\"inner\">\n <slot name=\"default\" />\n </div>\n </div>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BA,MAAM,OAAO;EASb,MAAM,QAAQ,eAA+B,OAAO;EAEpD,MAAM,YAAY,MAAM;EACxB,MAAM,YAAY,MAAM;EACxB,MAAM,EAAE,QAAQ,gBAAgB,eAAe,KAAK;EAEpD,MAAM,gBAAgB,eAAwB,QAAA,OAAO,GAAG,IAAI,WAAW,EAAE,MAAM,KAAM;EAErF,SAAS,SAAe;GACtB,KAAK,OAAO;EACd;EAEA,SAAS,UAAU,OAA4B;GAC7C,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;IAC9C,MAAM,eAAe;IACrB,OAAO;GACT;EACF;EAEA,MAAM,YAAY,GAAG,EAAE,MAAM,4BAA4B,CAAC;;GAIxD,OAAAE,UAAA,GAAAC,mBA+CM,OA/CNC,WA+CM;IA9CH,OAAOC,MAAA,SAAA,CAAS,CAAA,EAAA,OAAUA,MAAA,EAAA,CAAE,CAAC,QAAA,YAAY,QAAQL,KAAAA,OAAO,KAAK,EAAA,CAAA;IAC7D,cAAY,QAAA,OAAI,SAAA;IACjB,kBAAA;GACaA,GAAAA;IAAAA,GAAAA,KAAAA;IAAM,OAAS,KAAA;GAAS,CAAA,GAAA,CAI7BC,KAAAA,OAAO,UADfC,UAAA,GAAAC,mBAyBM,OAAA;;IAvBH,IAAIE,MAAA,SAAA;IACL,OAAKC,eAAA,CAAC,0HAAwH,CACrH,QAAA,YAAY,QAAM,EAAA,UAAc,QAAA,WAAU,CAAA,CAAA,CAAA;IACnD,MAAK;IACL,UAAS;IACR,iBAAe,QAAA;IACf,iBAAeD,MAAA,SAAA;IAChB,0BAAA;IACC,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,OAAM;IACb,WAAO,OAAA,OAAA,OAAA,MAAA,WAAE,UAAU,MAAM;GAE1BE,GAAAA,CAAAA,mBAKM,OAAA,EALA,OAAKD,eAAA,EAAA,MAAU,QAAA,WAAU,CAAA,EAAA,GAAA,CAC7BE,WAGE,KAAA,QAAA,UAAA,EADC,MAAM,QAAA,KAAI,CAAA,CAAA,GAAA,CAAA,GAGfC,YAKEC,iBAAA;IAJA,OAAKJ,eAAA,CAAC,4IAA0I,EAAA,eACvH,QAAA,KAAI,CAAA,CAAA;IAC7B,MAAK;IACJ,MAAM;GAIH,GAAA,MAAA,GAAA,CAAA,OAAA,CAAA,CAAA,GAAA,IAAA,UAAA,KAAA,mBAAA,IAAA,IAAA,GAAA,QAAA,QAAQ,QAAA,SADhBJ,UAAA,GAAAC,mBAaM,OAAA;;IAXH,IAAIE,MAAA,SAAA;IACL,OAAKC,eAAA,CAAC,uGACE,QAAA,YAAY,OAAO,CAAA;IAC1B,OAAKM,eAAA,EAAA,QAAYP,MAAA,aAAA,EAAa,CAAA;IAC/B,MAAK;IACJ,mBAAiBA,MAAA,SAAA;IAClB,0BAAA;GAEAE,GAAAA,CAAAA,mBAEM,OAAA;IAFG,SAAA;IAAJ,KAAI;GACPC,GAAAA,CAAAA,WAAuB,KAAA,QAAA,SAAA,CAAA,GAAA,GAAA,CAAA,GAAA,IAAA,UAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,GAAA,IAAA,UAAA"}
1
+ {"version":3,"file":"RuiAccordion.vue_vue_type_script_setup_true_lang.js","names":["$attrs","$slots","_openBlock","_createElementBlock","_mergeProps","_unref","_normalizeClass","_createElementVNode","_renderSlot","_createVNode","Icon","_createCommentVNode","_normalizeStyle"],"sources":["../../../../src/components/accordions/accordion/RuiAccordion.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { VueClassValue } from '@/types/class-value';\nimport Icon from '@/components/icons/RuiIcon.vue';\nimport { useClipWhileResizing } from '@/composables/clip-while-resizing';\nimport { cn, tv } from '@/utils/tv';\n\nexport interface RuiAccordionClassNames {\n root?: VueClassValue;\n header?: VueClassValue;\n content?: VueClassValue;\n}\n\nexport interface AccordionProps {\n open?: boolean;\n eager?: boolean;\n headerGrow?: boolean;\n classNames?: RuiAccordionClassNames;\n}\n\ndefineOptions({\n name: 'RuiAccordion',\n inheritAttrs: false,\n});\n\nconst {\n open = false,\n eager = false,\n headerGrow = false,\n classNames,\n} = defineProps<AccordionProps>();\n\nconst emit = defineEmits<{\n click: [];\n}>();\n\ndefineSlots<{\n header?: (props: { open: boolean }) => any;\n default?: () => any;\n}>();\n\nconst inner = useTemplateRef<HTMLDivElement>('inner');\nconst content = useTemplateRef<HTMLDivElement>('content');\n\nconst triggerId = useId();\nconst contentId = useId();\nconst { height: innerHeight } = useElementSize(inner);\n\nconst contentHeight = computed<string>(() => (open ? `${get(innerHeight)}px` : '0px'));\n\nconst resizing = useClipWhileResizing(content, contentHeight);\n\n// a closed `eager` panel keeps its content at height 0, so it clips; an open one only while it resizes, so sticky content works\nconst clipped = computed<boolean>(() => !open || get(resizing));\n\nfunction toggle(): void {\n emit('click');\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n toggle();\n }\n}\n\nconst rootStyle = tv({ base: 'flex flex-col items-start' });\n</script>\n\n<template>\n <div\n :class=\"rootStyle({ class: cn(classNames?.root ?? $attrs.class) })\"\n :data-state=\"open ? 'open' : 'closed'\"\n data-accordion\n v-bind=\"{ ...$attrs, class: undefined }\"\n >\n <!-- rounded only while focused: a permanent radius bent any border an app draws on the header -->\n <div\n v-if=\"$slots.header\"\n :id=\"triggerId\"\n class=\"group flex gap-2 items-center cursor-pointer outline-hidden focus-visible:focus-ring focus-visible:rounded-rui-control\"\n :class=\"[classNames?.header, { 'w-full': headerGrow }]\"\n role=\"button\"\n tabindex=\"0\"\n :aria-expanded=\"open\"\n :aria-controls=\"contentId\"\n data-accordion-trigger\n @click=\"toggle()\"\n @keydown=\"onKeydown($event)\"\n >\n <div :class=\"{ grow: headerGrow }\">\n <slot\n name=\"header\"\n :open=\"open\"\n />\n </div>\n <Icon\n class=\"shrink-0 text-rui-text-secondary transition-[rotate,color] duration-200 ease-out group-hover:text-rui-text motion-reduce:transition-none\"\n :class=\"{ '-rotate-180': open }\"\n name=\"lu-chevron-down\"\n :size=\"16\"\n />\n </div>\n <div\n v-if=\"open || eager\"\n :id=\"contentId\"\n ref=\"content\"\n class=\"grow transition-[height] duration-200 ease-out w-full motion-reduce:transition-none\"\n :class=\"[{ 'overflow-hidden': clipped }, classNames?.content]\"\n :data-clipped=\"clipped || undefined\"\n :style=\"{ height: contentHeight }\"\n role=\"region\"\n :aria-labelledby=\"triggerId\"\n data-accordion-content\n >\n <div ref=\"inner\">\n <slot name=\"default\" />\n </div>\n </div>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BA,MAAM,OAAO;EASb,MAAM,QAAQ,eAA+B,OAAO;EACpD,MAAM,UAAU,eAA+B,SAAS;EAExD,MAAM,YAAY,MAAM;EACxB,MAAM,YAAY,MAAM;EACxB,MAAM,EAAE,QAAQ,gBAAgB,eAAe,KAAK;EAEpD,MAAM,gBAAgB,eAAwB,QAAA,OAAO,GAAG,IAAI,WAAW,EAAE,MAAM,KAAM;EAErF,MAAM,WAAW,qBAAqB,SAAS,aAAa;EAG5D,MAAM,UAAU,eAAwB,CAAC,QAAA,QAAQ,IAAI,QAAQ,CAAC;EAE9D,SAAS,SAAe;GACtB,KAAK,OAAO;EACd;EAEA,SAAS,UAAU,OAA4B;GAC7C,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;IAC9C,MAAM,eAAe;IACrB,OAAO;GACT;EACF;EAEA,MAAM,YAAY,GAAG,EAAE,MAAM,4BAA4B,CAAC;;GAIxD,OAAAE,UAAA,GAAAC,mBAiDM,OAjDNC,WAiDM;IAhDH,OAAOC,MAAA,SAAA,CAAS,CAAA,EAAA,OAAUA,MAAA,EAAA,CAAE,CAAC,QAAA,YAAY,QAAQL,KAAAA,OAAO,KAAK,EAAA,CAAA;IAC7D,cAAY,QAAA,OAAI,SAAA;IACjB,kBAAA;GACaA,GAAAA;IAAAA,GAAAA,KAAAA;IAAM,OAAS,KAAA;GAAS,CAAA,GAAA,CAI7BC,KAAAA,OAAO,UADfC,UAAA,GAAAC,mBAyBM,OAAA;;IAvBH,IAAIE,MAAA,SAAA;IACL,OAAKC,eAAA,CAAC,0HAAwH,CACrH,QAAA,YAAY,QAAM,EAAA,UAAc,QAAA,WAAU,CAAA,CAAA,CAAA;IACnD,MAAK;IACL,UAAS;IACR,iBAAe,QAAA;IACf,iBAAeD,MAAA,SAAA;IAChB,0BAAA;IACC,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,OAAM;IACb,WAAO,OAAA,OAAA,OAAA,MAAA,WAAE,UAAU,MAAM;GAE1BE,GAAAA,CAAAA,mBAKM,OAAA,EALA,OAAKD,eAAA,EAAA,MAAU,QAAA,WAAU,CAAA,EAAA,GAAA,CAC7BE,WAGE,KAAA,QAAA,UAAA,EADC,MAAM,QAAA,KAAI,CAAA,CAAA,GAAA,CAAA,GAGfC,YAKEC,iBAAA;IAJA,OAAKJ,eAAA,CAAC,4IAA0I,EAAA,eACvH,QAAA,KAAI,CAAA,CAAA;IAC7B,MAAK;IACJ,MAAM;GAIH,GAAA,MAAA,GAAA,CAAA,OAAA,CAAA,CAAA,GAAA,IAAA,UAAA,KAAA,mBAAA,IAAA,IAAA,GAAA,QAAA,QAAQ,QAAA,SADhBJ,UAAA,GAAAC,mBAeM,OAAA;;IAbH,IAAIE,MAAA,SAAA;IACD,SAAA;IAAJ,KAAI;IACJ,OAAKC,eAAA,CAAC,uFAAqF,CAAA,EAAA,mBAC7DD,MAAA,OAAA,EAAO,GAAI,QAAA,YAAY,OAAO,CAAA,CAAA;IAC3D,gBAAcA,MAAA,OAAA,KAAW,KAAA;IACzB,OAAKO,eAAA,EAAA,QAAYP,MAAA,aAAA,EAAa,CAAA;IAC/B,MAAK;IACJ,mBAAiBA,MAAA,SAAA;IAClB,0BAAA;GAEAE,GAAAA,CAAAA,mBAEM,OAAA;IAFG,SAAA;IAAJ,KAAI;GACPC,GAAAA,CAAAA,WAAuB,KAAA,QAAA,SAAA,CAAA,GAAA,GAAA,CAAA,GAAA,IAAA,UAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,GAAA,IAAA,UAAA"}
@@ -14,11 +14,11 @@ type __VLS_Slots = {
14
14
  default?: () => any;
15
15
  };
16
16
  declare const __VLS_base: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
17
- action: () => any;
18
17
  close: () => any;
18
+ action: () => any;
19
19
  }, string, import("vue").PublicProps, Readonly<Props> & Readonly<{
20
- onAction?: (() => any) | undefined;
21
20
  onClose?: (() => any) | undefined;
21
+ onAction?: (() => any) | undefined;
22
22
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
23
23
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
24
24
  declare const _default: typeof __VLS_export;
@@ -1 +1 @@
1
- {"version":3,"file":"RuiButton.js","names":["_sfc_main"],"sources":["../../../../src/components/buttons/button/RuiButton.vue"],"sourcesContent":["<script lang=\"ts\" generic=\"T = undefined\" setup>\nimport type { ContextColorsType } from '@/consts/colors';\nimport { ButtonGroupKey } from '@/components/buttons/button-group/button-group-context';\nimport { type ButtonSize, ButtonVariant, getButtonSpinnerSize } from '@/components/buttons/button/button-props';\nimport { buttonStyles } from '@/components/buttons/button/button-styles';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { cn } from '@/utils/tv';\n\nexport interface Props<T = undefined> {\n disabled?: boolean;\n loading?: boolean;\n color?: ContextColorsType;\n rounded?: boolean;\n variant?: ButtonVariant;\n icon?: boolean;\n active?: boolean;\n size?: ButtonSize;\n tag?: 'button' | 'a';\n type?: 'button' | 'submit';\n modelValue?: T;\n hideFocusIndicator?: boolean;\n}\n\ndefineOptions({\n name: 'RuiButton',\n inheritAttrs: false,\n});\n\nconst {\n disabled = false,\n loading = false,\n color = undefined,\n rounded = false,\n variant = ButtonVariant.default,\n icon = false,\n active = false,\n size = undefined,\n tag = 'button',\n type = 'button',\n modelValue = undefined,\n hideFocusIndicator = false,\n} = defineProps<Props<T>>();\n\nconst emit = defineEmits<{\n 'update:model-value': [value?: T];\n}>();\n\nconst slots = defineSlots<{\n prepend?: () => any;\n append?: () => any;\n default?: () => any;\n}>();\n\n// a RuiButtonGroup anywhere above, unless an overlay's content sits in between\nconst group = inject(ButtonGroupKey, undefined);\n\nconst btnValue = computed<T | undefined>(() => modelValue);\n\nconst resolvedVariant = computed<ButtonVariant>(() => group?.variant() ?? variant);\n\nconst resolvedSize = computed<ButtonSize | undefined>(() => size ?? group?.size());\n\nconst resolvedDisabled = computed<boolean>(() => disabled || (group?.disabled() ?? false));\n\n// a grouped button is pressed when the group's model holds its value; it needs one to take part\nconst resolvedActive = computed<boolean>(() => active || (!!group && modelValue !== undefined && group.isActive(modelValue)));\n\nconst resolvedColor = computed<ContextColorsType | undefined>(() => group?.color(get(resolvedActive)) ?? color);\n\nconst spinnerSize = computed<number>(() => getButtonSpinnerSize(get(resolvedSize)));\n\nconst ui = computed<ReturnType<typeof buttonStyles>>(() => buttonStyles({\n variant: get(resolvedVariant),\n color: get(resolvedColor) ?? 'grey',\n size: get(resolvedSize),\n rounded,\n icon,\n active: get(resolvedActive),\n loading,\n hideFocusIndicator,\n}));\n\nfunction onClick(): void {\n emit('update:model-value', get(btnValue));\n if (group && modelValue !== undefined)\n group.toggle(modelValue);\n}\n</script>\n\n<template>\n <Component\n :is=\"tag\"\n :class=\"ui.root({ class: cn([group?.itemClass(), $attrs.class]) })\"\n :disabled=\"resolvedDisabled || loading\"\n :type=\"tag === 'button' ? type : undefined\"\n :data-variant=\"resolvedVariant\"\n :data-size=\"resolvedSize ?? 'md'\"\n :data-color=\"resolvedColor\"\n :data-active=\"resolvedActive || undefined\"\n :aria-busy=\"loading || undefined\"\n v-bind=\"{ ...$attrs, class: undefined }\"\n @click=\"onClick()\"\n >\n <!-- the button's aria-busy announces the wait, so the spinner stays out of the accessibility tree -->\n <RuiProgress\n v-if=\"loading\"\n circular\n data-spinner\n aria-hidden=\"true\"\n :class=\"ui.spinner()\"\n variant=\"indeterminate\"\n thickness=\"2\"\n :size=\"spinnerSize\"\n />\n <!-- while loading, the spinner stands in for the prepend icon; the label stays -->\n <slot\n v-if=\"!loading || icon\"\n name=\"prepend\"\n />\n <span\n v-if=\"slots.default\"\n :class=\"ui.label()\"\n data-id=\"btn-label\"\n >\n <slot />\n </span>\n <slot name=\"append\" />\n </Component>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"RuiButton.js","names":["_sfc_main"],"sources":["../../../../src/components/buttons/button/RuiButton.vue"],"sourcesContent":["<script lang=\"ts\" generic=\"T = undefined\" setup>\nimport type { ContextColorsType } from '@/consts/colors';\nimport { ButtonGroupKey } from '@/components/buttons/button-group/button-group-context';\nimport { type ButtonCollapseBreakpoint, type ButtonSize, ButtonVariant, getButtonSpinnerSize } from '@/components/buttons/button/button-props';\nimport { buttonStyles } from '@/components/buttons/button/button-styles';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { cn } from '@/utils/tv';\n\nexport interface Props<T = undefined> {\n disabled?: boolean;\n loading?: boolean;\n color?: ContextColorsType;\n rounded?: boolean;\n variant?: ButtonVariant;\n icon?: boolean;\n active?: boolean;\n size?: ButtonSize;\n tag?: 'button' | 'a';\n type?: 'button' | 'submit';\n modelValue?: T;\n hideFocusIndicator?: boolean;\n /**\n * Below this breakpoint the button shows only its icons: the label becomes screen-reader text,\n * so it still names the button, and the button takes its icon-only padding. Give it a `prepend`\n * or `append` icon. Ignored on an `icon` button.\n */\n collapseBelow?: ButtonCollapseBreakpoint;\n}\n\ndefineOptions({\n name: 'RuiButton',\n inheritAttrs: false,\n});\n\nconst {\n disabled = false,\n loading = false,\n color = undefined,\n rounded = false,\n variant = ButtonVariant.default,\n icon = false,\n active = false,\n size = undefined,\n tag = 'button',\n type = 'button',\n modelValue = undefined,\n hideFocusIndicator = false,\n collapseBelow = undefined,\n} = defineProps<Props<T>>();\n\nconst emit = defineEmits<{\n 'update:model-value': [value?: T];\n}>();\n\nconst slots = defineSlots<{\n prepend?: () => any;\n append?: () => any;\n default?: () => any;\n}>();\n\n// a RuiButtonGroup anywhere above, unless an overlay's content sits in between\nconst group = inject(ButtonGroupKey, undefined);\n\nconst btnValue = computed<T | undefined>(() => modelValue);\n\nconst resolvedVariant = computed<ButtonVariant>(() => group?.variant() ?? variant);\n\nconst resolvedSize = computed<ButtonSize | undefined>(() => size ?? group?.size());\n\nconst resolvedDisabled = computed<boolean>(() => disabled || (group?.disabled() ?? false));\n\n// a grouped button is pressed when the group's model holds its value; it needs one to take part\nconst resolvedActive = computed<boolean>(() => active || (!!group && modelValue !== undefined && group.isActive(modelValue)));\n\nconst resolvedColor = computed<ContextColorsType | undefined>(() => group?.color(get(resolvedActive)) ?? color);\n\nconst spinnerSize = computed<number>(() => getButtonSpinnerSize(get(resolvedSize)));\n\nconst ui = computed<ReturnType<typeof buttonStyles>>(() => buttonStyles({\n variant: get(resolvedVariant),\n color: get(resolvedColor) ?? 'grey',\n size: get(resolvedSize),\n rounded,\n icon,\n active: get(resolvedActive),\n loading,\n hideFocusIndicator,\n collapseBelow: icon ? undefined : collapseBelow,\n}));\n\nfunction onClick(): void {\n emit('update:model-value', get(btnValue));\n if (group && modelValue !== undefined)\n group.toggle(modelValue);\n}\n</script>\n\n<template>\n <Component\n :is=\"tag\"\n :class=\"ui.root({ class: cn([group?.itemClass(), $attrs.class]) })\"\n :disabled=\"resolvedDisabled || loading\"\n :type=\"tag === 'button' ? type : undefined\"\n :data-variant=\"resolvedVariant\"\n :data-size=\"resolvedSize ?? 'md'\"\n :data-color=\"resolvedColor\"\n :data-active=\"resolvedActive || undefined\"\n :aria-busy=\"loading || undefined\"\n v-bind=\"{ ...$attrs, class: undefined }\"\n @click=\"onClick()\"\n >\n <!-- the button's aria-busy announces the wait, so the spinner stays out of the accessibility tree -->\n <RuiProgress\n v-if=\"loading\"\n circular\n data-spinner\n aria-hidden=\"true\"\n :class=\"ui.spinner()\"\n variant=\"indeterminate\"\n thickness=\"2\"\n :size=\"spinnerSize\"\n />\n <!-- while loading, the spinner stands in for the prepend icon; the label stays -->\n <slot\n v-if=\"!loading || icon\"\n name=\"prepend\"\n />\n <span\n v-if=\"slots.default\"\n :class=\"ui.label()\"\n data-id=\"btn-label\"\n >\n <slot />\n </span>\n <slot name=\"append\" />\n </Component>\n</template>\n"],"mappings":""}
@@ -1,5 +1,5 @@
1
1
  import type { ContextColorsType } from '../../../consts/colors.js';
2
- import { type ButtonSize, ButtonVariant } from './button-props.js';
2
+ import { type ButtonCollapseBreakpoint, type ButtonSize, ButtonVariant } from './button-props.js';
3
3
  export interface Props<T = undefined> {
4
4
  disabled?: boolean;
5
5
  loading?: boolean;
@@ -13,6 +13,12 @@ export interface Props<T = undefined> {
13
13
  type?: 'button' | 'submit';
14
14
  modelValue?: T;
15
15
  hideFocusIndicator?: boolean;
16
+ /**
17
+ * Below this breakpoint the button shows only its icons: the label becomes screen-reader text,
18
+ * so it still names the button, and the button takes its icon-only padding. Give it a `prepend`
19
+ * or `append` icon. Ignored on an `icon` button.
20
+ */
21
+ collapseBelow?: ButtonCollapseBreakpoint;
16
22
  }
17
23
  declare const __VLS_export: <T = undefined>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
18
24
  props: import("vue").PublicProps & __VLS_PrettifyLocal<Props<T> & {
@@ -40,7 +40,8 @@ var RuiButton_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
40
40
  hideFocusIndicator: {
41
41
  type: Boolean,
42
42
  default: false
43
- }
43
+ },
44
+ collapseBelow: { default: () => void 0 }
44
45
  },
45
46
  emits: ["update:model-value"],
46
47
  setup(__props, { emit: __emit }) {
@@ -62,7 +63,8 @@ var RuiButton_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
62
63
  icon: __props.icon,
63
64
  active: get(resolvedActive),
64
65
  loading: __props.loading,
65
- hideFocusIndicator: __props.hideFocusIndicator
66
+ hideFocusIndicator: __props.hideFocusIndicator,
67
+ collapseBelow: __props.icon ? void 0 : __props.collapseBelow
66
68
  }));
67
69
  function onClick() {
68
70
  emit("update:model-value", get(btnValue));
@@ -1 +1 @@
1
- {"version":3,"file":"RuiButton.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_useSlots","_openBlock","_createBlock","_resolveDynamicComponent","_mergeProps","_unref","_withCtx","RuiProgress","_normalizeClass","_createCommentVNode","_renderSlot","_createElementBlock"],"sources":["../../../../src/components/buttons/button/RuiButton.vue"],"sourcesContent":["<script lang=\"ts\" generic=\"T = undefined\" setup>\nimport type { ContextColorsType } from '@/consts/colors';\nimport { ButtonGroupKey } from '@/components/buttons/button-group/button-group-context';\nimport { type ButtonSize, ButtonVariant, getButtonSpinnerSize } from '@/components/buttons/button/button-props';\nimport { buttonStyles } from '@/components/buttons/button/button-styles';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { cn } from '@/utils/tv';\n\nexport interface Props<T = undefined> {\n disabled?: boolean;\n loading?: boolean;\n color?: ContextColorsType;\n rounded?: boolean;\n variant?: ButtonVariant;\n icon?: boolean;\n active?: boolean;\n size?: ButtonSize;\n tag?: 'button' | 'a';\n type?: 'button' | 'submit';\n modelValue?: T;\n hideFocusIndicator?: boolean;\n}\n\ndefineOptions({\n name: 'RuiButton',\n inheritAttrs: false,\n});\n\nconst {\n disabled = false,\n loading = false,\n color = undefined,\n rounded = false,\n variant = ButtonVariant.default,\n icon = false,\n active = false,\n size = undefined,\n tag = 'button',\n type = 'button',\n modelValue = undefined,\n hideFocusIndicator = false,\n} = defineProps<Props<T>>();\n\nconst emit = defineEmits<{\n 'update:model-value': [value?: T];\n}>();\n\nconst slots = defineSlots<{\n prepend?: () => any;\n append?: () => any;\n default?: () => any;\n}>();\n\n// a RuiButtonGroup anywhere above, unless an overlay's content sits in between\nconst group = inject(ButtonGroupKey, undefined);\n\nconst btnValue = computed<T | undefined>(() => modelValue);\n\nconst resolvedVariant = computed<ButtonVariant>(() => group?.variant() ?? variant);\n\nconst resolvedSize = computed<ButtonSize | undefined>(() => size ?? group?.size());\n\nconst resolvedDisabled = computed<boolean>(() => disabled || (group?.disabled() ?? false));\n\n// a grouped button is pressed when the group's model holds its value; it needs one to take part\nconst resolvedActive = computed<boolean>(() => active || (!!group && modelValue !== undefined && group.isActive(modelValue)));\n\nconst resolvedColor = computed<ContextColorsType | undefined>(() => group?.color(get(resolvedActive)) ?? color);\n\nconst spinnerSize = computed<number>(() => getButtonSpinnerSize(get(resolvedSize)));\n\nconst ui = computed<ReturnType<typeof buttonStyles>>(() => buttonStyles({\n variant: get(resolvedVariant),\n color: get(resolvedColor) ?? 'grey',\n size: get(resolvedSize),\n rounded,\n icon,\n active: get(resolvedActive),\n loading,\n hideFocusIndicator,\n}));\n\nfunction onClick(): void {\n emit('update:model-value', get(btnValue));\n if (group && modelValue !== undefined)\n group.toggle(modelValue);\n}\n</script>\n\n<template>\n <Component\n :is=\"tag\"\n :class=\"ui.root({ class: cn([group?.itemClass(), $attrs.class]) })\"\n :disabled=\"resolvedDisabled || loading\"\n :type=\"tag === 'button' ? type : undefined\"\n :data-variant=\"resolvedVariant\"\n :data-size=\"resolvedSize ?? 'md'\"\n :data-color=\"resolvedColor\"\n :data-active=\"resolvedActive || undefined\"\n :aria-busy=\"loading || undefined\"\n v-bind=\"{ ...$attrs, class: undefined }\"\n @click=\"onClick()\"\n >\n <!-- the button's aria-busy announces the wait, so the spinner stays out of the accessibility tree -->\n <RuiProgress\n v-if=\"loading\"\n circular\n data-spinner\n aria-hidden=\"true\"\n :class=\"ui.spinner()\"\n variant=\"indeterminate\"\n thickness=\"2\"\n :size=\"spinnerSize\"\n />\n <!-- while loading, the spinner stands in for the prepend icon; the label stays -->\n <slot\n v-if=\"!loading || icon\"\n name=\"prepend\"\n />\n <span\n v-if=\"slots.default\"\n :class=\"ui.label()\"\n data-id=\"btn-label\"\n >\n <slot />\n </span>\n <slot name=\"append\" />\n </Component>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2CA,MAAM,OAAO;EAIb,MAAM,QAAQC,SAAA;EAOd,MAAM,QAAQ,OAAO,gBAAgB,KAAA,CAAS;EAE9C,MAAM,WAAW,eAA8B,QAAA,UAAU;EAEzD,MAAM,kBAAkB,eAA8B,OAAO,QAAQ,KAAK,QAAA,OAAO;EAEjF,MAAM,eAAe,eAAuC,QAAA,QAAQ,OAAO,KAAK,CAAC;EAEjF,MAAM,mBAAmB,eAAwB,QAAA,aAAa,OAAO,SAAS,KAAK,MAAM;EAGzF,MAAM,iBAAiB,eAAwB,QAAA,UAAW,CAAC,CAAC,SAAS,QAAA,eAAe,KAAA,KAAa,MAAM,SAAS,QAAA,UAAU,CAAE;EAE5H,MAAM,gBAAgB,eAA8C,OAAO,MAAM,IAAI,cAAc,CAAC,KAAK,QAAA,KAAK;EAE9G,MAAM,cAAc,eAAuB,qBAAqB,IAAI,YAAY,CAAC,CAAC;EAElF,MAAM,KAAK,eAAgD,aAAa;GACtE,SAAS,IAAI,eAAe;GAC5B,OAAO,IAAI,aAAa,KAAK;GAC7B,MAAM,IAAI,YAAY;GACtB,SAAM,QAAA;GACN,MAAG,QAAA;GACH,QAAQ,IAAI,cAAc;GAC1B,SAAM,QAAA;GACN,oBAAiB,QAAA;EACnB,CAAC,CAAC;EAEF,SAAS,UAAgB;GACvB,KAAK,sBAAsB,IAAI,QAAQ,CAAC;GACxC,IAAI,SAAS,QAAA,eAAe,KAAA,GAC1B,MAAM,OAAO,QAAA,UAAU;EAC3B;;GAIE,OAAAC,UAAA,GAAAC,YAqCYC,wBApCL,QAAA,GAAG,GADVC,WAqCY;IAnCT,OAAOC,MAAA,EAAA,CAAE,CAAC,KAAI,EAAA,OAAUA,MAAA,EAAA,CAAE,CAAA,CAAEA,MAAA,KAAA,CAAK,EAAE,UAAS,GAAIN,KAAAA,OAAO,KAAK,CAAA,EAAA,CAAA;IAC5D,UAAUM,MAAA,gBAAA,KAAoB,QAAA;IAC9B,MAAM,QAAA,QAAG,WAAgB,QAAA,OAAO,KAAA;IAChC,gBAAcA,MAAA,eAAA;IACd,aAAWA,MAAA,YAAA,KAAY;IACvB,cAAYA,MAAA,aAAA;IACZ,eAAaA,MAAA,cAAA,KAAkB,KAAA;IAC/B,aAAW,QAAA,WAAW,KAAA;GACVN,GAAAA;IAAAA,GAAAA,KAAAA;IAAM,OAAS,KAAA;GAAS,GAAA,EACpC,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,QAAO,GAAA,CAAA,GAAA;IAGf,SAAAO,cASE;KARM,QAAA,WADRL,UAAA,GAAAC,YASEK,qBAAA;;MAPA,UAAA;MACA,gBAAA;MACA,eAAY;MACX,OAAKC,eAAEH,MAAA,EAAA,CAAE,CAAC,QAAO,CAAA;MAClB,SAAQ;MACR,WAAU;MACT,MAAMA,MAAA,WAAA;;KAIA,CAAA,QAAA,WAAW,QAAA,OADpBK,WAGE,KAAA,QAAA,WAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,IAAA,mBAAA,IAAA,IAAA;KAEM,MAAM,WADdT,UAAA,GAAAU,mBAMO,QAAA;;MAJJ,OAAKH,eAAEH,MAAA,EAAA,CAAE,CAAC,MAAK,CAAA;MAChB,WAAQ;KAERK,GAAAA,CAAAA,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;KAEVA,WAAsB,KAAA,QAAA,QAAA"}
1
+ {"version":3,"file":"RuiButton.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_useSlots","_openBlock","_createBlock","_resolveDynamicComponent","_mergeProps","_unref","_withCtx","RuiProgress","_normalizeClass","_createCommentVNode","_renderSlot","_createElementBlock"],"sources":["../../../../src/components/buttons/button/RuiButton.vue"],"sourcesContent":["<script lang=\"ts\" generic=\"T = undefined\" setup>\nimport type { ContextColorsType } from '@/consts/colors';\nimport { ButtonGroupKey } from '@/components/buttons/button-group/button-group-context';\nimport { type ButtonCollapseBreakpoint, type ButtonSize, ButtonVariant, getButtonSpinnerSize } from '@/components/buttons/button/button-props';\nimport { buttonStyles } from '@/components/buttons/button/button-styles';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { cn } from '@/utils/tv';\n\nexport interface Props<T = undefined> {\n disabled?: boolean;\n loading?: boolean;\n color?: ContextColorsType;\n rounded?: boolean;\n variant?: ButtonVariant;\n icon?: boolean;\n active?: boolean;\n size?: ButtonSize;\n tag?: 'button' | 'a';\n type?: 'button' | 'submit';\n modelValue?: T;\n hideFocusIndicator?: boolean;\n /**\n * Below this breakpoint the button shows only its icons: the label becomes screen-reader text,\n * so it still names the button, and the button takes its icon-only padding. Give it a `prepend`\n * or `append` icon. Ignored on an `icon` button.\n */\n collapseBelow?: ButtonCollapseBreakpoint;\n}\n\ndefineOptions({\n name: 'RuiButton',\n inheritAttrs: false,\n});\n\nconst {\n disabled = false,\n loading = false,\n color = undefined,\n rounded = false,\n variant = ButtonVariant.default,\n icon = false,\n active = false,\n size = undefined,\n tag = 'button',\n type = 'button',\n modelValue = undefined,\n hideFocusIndicator = false,\n collapseBelow = undefined,\n} = defineProps<Props<T>>();\n\nconst emit = defineEmits<{\n 'update:model-value': [value?: T];\n}>();\n\nconst slots = defineSlots<{\n prepend?: () => any;\n append?: () => any;\n default?: () => any;\n}>();\n\n// a RuiButtonGroup anywhere above, unless an overlay's content sits in between\nconst group = inject(ButtonGroupKey, undefined);\n\nconst btnValue = computed<T | undefined>(() => modelValue);\n\nconst resolvedVariant = computed<ButtonVariant>(() => group?.variant() ?? variant);\n\nconst resolvedSize = computed<ButtonSize | undefined>(() => size ?? group?.size());\n\nconst resolvedDisabled = computed<boolean>(() => disabled || (group?.disabled() ?? false));\n\n// a grouped button is pressed when the group's model holds its value; it needs one to take part\nconst resolvedActive = computed<boolean>(() => active || (!!group && modelValue !== undefined && group.isActive(modelValue)));\n\nconst resolvedColor = computed<ContextColorsType | undefined>(() => group?.color(get(resolvedActive)) ?? color);\n\nconst spinnerSize = computed<number>(() => getButtonSpinnerSize(get(resolvedSize)));\n\nconst ui = computed<ReturnType<typeof buttonStyles>>(() => buttonStyles({\n variant: get(resolvedVariant),\n color: get(resolvedColor) ?? 'grey',\n size: get(resolvedSize),\n rounded,\n icon,\n active: get(resolvedActive),\n loading,\n hideFocusIndicator,\n collapseBelow: icon ? undefined : collapseBelow,\n}));\n\nfunction onClick(): void {\n emit('update:model-value', get(btnValue));\n if (group && modelValue !== undefined)\n group.toggle(modelValue);\n}\n</script>\n\n<template>\n <Component\n :is=\"tag\"\n :class=\"ui.root({ class: cn([group?.itemClass(), $attrs.class]) })\"\n :disabled=\"resolvedDisabled || loading\"\n :type=\"tag === 'button' ? type : undefined\"\n :data-variant=\"resolvedVariant\"\n :data-size=\"resolvedSize ?? 'md'\"\n :data-color=\"resolvedColor\"\n :data-active=\"resolvedActive || undefined\"\n :aria-busy=\"loading || undefined\"\n v-bind=\"{ ...$attrs, class: undefined }\"\n @click=\"onClick()\"\n >\n <!-- the button's aria-busy announces the wait, so the spinner stays out of the accessibility tree -->\n <RuiProgress\n v-if=\"loading\"\n circular\n data-spinner\n aria-hidden=\"true\"\n :class=\"ui.spinner()\"\n variant=\"indeterminate\"\n thickness=\"2\"\n :size=\"spinnerSize\"\n />\n <!-- while loading, the spinner stands in for the prepend icon; the label stays -->\n <slot\n v-if=\"!loading || icon\"\n name=\"prepend\"\n />\n <span\n v-if=\"slots.default\"\n :class=\"ui.label()\"\n data-id=\"btn-label\"\n >\n <slot />\n </span>\n <slot name=\"append\" />\n </Component>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkDA,MAAM,OAAO;EAIb,MAAM,QAAQC,SAAA;EAOd,MAAM,QAAQ,OAAO,gBAAgB,KAAA,CAAS;EAE9C,MAAM,WAAW,eAA8B,QAAA,UAAU;EAEzD,MAAM,kBAAkB,eAA8B,OAAO,QAAQ,KAAK,QAAA,OAAO;EAEjF,MAAM,eAAe,eAAuC,QAAA,QAAQ,OAAO,KAAK,CAAC;EAEjF,MAAM,mBAAmB,eAAwB,QAAA,aAAa,OAAO,SAAS,KAAK,MAAM;EAGzF,MAAM,iBAAiB,eAAwB,QAAA,UAAW,CAAC,CAAC,SAAS,QAAA,eAAe,KAAA,KAAa,MAAM,SAAS,QAAA,UAAU,CAAE;EAE5H,MAAM,gBAAgB,eAA8C,OAAO,MAAM,IAAI,cAAc,CAAC,KAAK,QAAA,KAAK;EAE9G,MAAM,cAAc,eAAuB,qBAAqB,IAAI,YAAY,CAAC,CAAC;EAElF,MAAM,KAAK,eAAgD,aAAa;GACtE,SAAS,IAAI,eAAe;GAC5B,OAAO,IAAI,aAAa,KAAK;GAC7B,MAAM,IAAI,YAAY;GACtB,SAAM,QAAA;GACN,MAAG,QAAA;GACH,QAAQ,IAAI,cAAc;GAC1B,SAAM,QAAA;GACN,oBAAiB,QAAA;GACjB,eAAe,QAAA,OAAO,KAAA,IAAY,QAAA;EACpC,CAAC,CAAC;EAEF,SAAS,UAAgB;GACvB,KAAK,sBAAsB,IAAI,QAAQ,CAAC;GACxC,IAAI,SAAS,QAAA,eAAe,KAAA,GAC1B,MAAM,OAAO,QAAA,UAAU;EAC3B;;GAIE,OAAAC,UAAA,GAAAC,YAqCYC,wBApCL,QAAA,GAAG,GADVC,WAqCY;IAnCT,OAAOC,MAAA,EAAA,CAAE,CAAC,KAAI,EAAA,OAAUA,MAAA,EAAA,CAAE,CAAA,CAAEA,MAAA,KAAA,CAAK,EAAE,UAAS,GAAIN,KAAAA,OAAO,KAAK,CAAA,EAAA,CAAA;IAC5D,UAAUM,MAAA,gBAAA,KAAoB,QAAA;IAC9B,MAAM,QAAA,QAAG,WAAgB,QAAA,OAAO,KAAA;IAChC,gBAAcA,MAAA,eAAA;IACd,aAAWA,MAAA,YAAA,KAAY;IACvB,cAAYA,MAAA,aAAA;IACZ,eAAaA,MAAA,cAAA,KAAkB,KAAA;IAC/B,aAAW,QAAA,WAAW,KAAA;GACVN,GAAAA;IAAAA,GAAAA,KAAAA;IAAM,OAAS,KAAA;GAAS,GAAA,EACpC,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,QAAO,GAAA,CAAA,GAAA;IAGf,SAAAO,cASE;KARM,QAAA,WADRL,UAAA,GAAAC,YASEK,qBAAA;;MAPA,UAAA;MACA,gBAAA;MACA,eAAY;MACX,OAAKC,eAAEH,MAAA,EAAA,CAAE,CAAC,QAAO,CAAA;MAClB,SAAQ;MACR,WAAU;MACT,MAAMA,MAAA,WAAA;;KAIA,CAAA,QAAA,WAAW,QAAA,OADpBK,WAGE,KAAA,QAAA,WAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,IAAA,mBAAA,IAAA,IAAA;KAEM,MAAM,WADdT,UAAA,GAAAU,mBAMO,QAAA;;MAJJ,OAAKH,eAAEH,MAAA,EAAA,CAAE,CAAC,MAAK,CAAA;MAChB,WAAQ;KAERK,GAAAA,CAAAA,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;KAEVA,WAAsB,KAAA,QAAA,QAAA"}
@@ -4,6 +4,7 @@ export declare const ButtonVariant: {
4
4
  readonly text: "text";
5
5
  readonly fab: "fab";
6
6
  readonly list: "list";
7
+ readonly link: "link";
7
8
  };
8
9
  export type ButtonVariant = (typeof ButtonVariant)[keyof typeof ButtonVariant];
9
10
  export declare const ButtonSize: {
@@ -14,4 +15,6 @@ export declare const ButtonSize: {
14
15
  readonly '2xl': "2xl";
15
16
  };
16
17
  export type ButtonSize = (typeof ButtonSize)[keyof typeof ButtonSize];
18
+ /** The Tailwind breakpoint below which `collapseBelow` hides a button's label. */
19
+ export type ButtonCollapseBreakpoint = 'sm' | 'md' | 'lg' | 'xl' | '2xl';
17
20
  export declare function getButtonSpinnerSize(size?: ButtonSize): number;
@@ -4,7 +4,8 @@ var ButtonVariant = {
4
4
  outlined: "outlined",
5
5
  text: "text",
6
6
  fab: "fab",
7
- list: "list"
7
+ list: "list",
8
+ link: "link"
8
9
  };
9
10
  var SPINNER_SIZES = {
10
11
  "xs": 12,
@@ -1 +1 @@
1
- {"version":3,"file":"button-props.js","names":[],"sources":["../../../../src/components/buttons/button/button-props.ts"],"sourcesContent":["export const ButtonVariant = {\n default: 'default',\n outlined: 'outlined',\n text: 'text',\n fab: 'fab',\n list: 'list',\n} as const;\n\nexport type ButtonVariant = (typeof ButtonVariant)[keyof typeof ButtonVariant];\n\nexport const ButtonSize = {\n 'xs': 'xs',\n 'sm': 'sm',\n 'lg': 'lg',\n 'xl': 'xl',\n '2xl': '2xl',\n} as const;\n\nexport type ButtonSize = (typeof ButtonSize)[keyof typeof ButtonSize];\n\n// the icon size plus 2px: the spinner takes the icon's place, a thin ring reading lighter than a glyph\nconst SPINNER_SIZES: Record<string, number> = { 'xs': 12, 'sm': 16, 'lg': 22, 'xl': 24, '2xl': 24 };\nconst DEFAULT_SPINNER_SIZE = 18;\n\nexport function getButtonSpinnerSize(size?: ButtonSize): number {\n return (size && SPINNER_SIZES[size]) || DEFAULT_SPINNER_SIZE;\n}\n"],"mappings":";AAAA,IAAa,gBAAgB;CAC3B,SAAS;CACT,UAAU;CACV,MAAM;CACN,KAAK;CACL,MAAM;AACR;AAeA,IAAM,gBAAwC;CAAE,MAAM;CAAI,MAAM;CAAI,MAAM;CAAI,MAAM;CAAI,OAAO;AAAG;AAClG,IAAM,uBAAuB;AAE7B,SAAgB,qBAAqB,MAA2B;CAC9D,OAAQ,QAAQ,cAAc,SAAU;AAC1C"}
1
+ {"version":3,"file":"button-props.js","names":[],"sources":["../../../../src/components/buttons/button/button-props.ts"],"sourcesContent":["export const ButtonVariant = {\n default: 'default',\n outlined: 'outlined',\n text: 'text',\n fab: 'fab',\n list: 'list',\n link: 'link',\n} as const;\n\nexport type ButtonVariant = (typeof ButtonVariant)[keyof typeof ButtonVariant];\n\nexport const ButtonSize = {\n 'xs': 'xs',\n 'sm': 'sm',\n 'lg': 'lg',\n 'xl': 'xl',\n '2xl': '2xl',\n} as const;\n\nexport type ButtonSize = (typeof ButtonSize)[keyof typeof ButtonSize];\n\n/** The Tailwind breakpoint below which `collapseBelow` hides a button's label. */\nexport type ButtonCollapseBreakpoint = 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\n// the icon size plus 2px: the spinner takes the icon's place, a thin ring reading lighter than a glyph\nconst SPINNER_SIZES: Record<string, number> = { 'xs': 12, 'sm': 16, 'lg': 22, 'xl': 24, '2xl': 24 };\nconst DEFAULT_SPINNER_SIZE = 18;\n\nexport function getButtonSpinnerSize(size?: ButtonSize): number {\n return (size && SPINNER_SIZES[size]) || DEFAULT_SPINNER_SIZE;\n}\n"],"mappings":";AAAA,IAAa,gBAAgB;CAC3B,SAAS;CACT,UAAU;CACV,MAAM;CACN,KAAK;CACL,MAAM;CACN,MAAM;AACR;AAkBA,IAAM,gBAAwC;CAAE,MAAM;CAAI,MAAM;CAAI,MAAM;CAAI,MAAM;CAAI,OAAO;AAAG;AAClG,IAAM,uBAAuB;AAE7B,SAAgB,qBAAqB,MAA2B;CAC9D,OAAQ,QAAQ,cAAc,SAAU;AAC1C"}
@@ -50,6 +50,9 @@ export declare const buttonStyles: import("tailwind-variants").TVReturnType<{
50
50
  root: string;
51
51
  label: string;
52
52
  };
53
+ link: {
54
+ root: string;
55
+ };
53
56
  };
54
57
  size: {
55
58
  xs: {
@@ -117,6 +120,28 @@ export declare const buttonStyles: import("tailwind-variants").TVReturnType<{
117
120
  root: string;
118
121
  };
119
122
  };
123
+ collapseBelow: {
124
+ sm: {
125
+ root: string;
126
+ label: string;
127
+ };
128
+ md: {
129
+ root: string;
130
+ label: string;
131
+ };
132
+ lg: {
133
+ root: string;
134
+ label: string;
135
+ };
136
+ xl: {
137
+ root: string;
138
+ label: string;
139
+ };
140
+ '2xl': {
141
+ root: string;
142
+ label: string;
143
+ };
144
+ };
120
145
  }, {
121
146
  root: string;
122
147
  label: string;
@@ -135,6 +160,9 @@ export declare const buttonStyles: import("tailwind-variants").TVReturnType<{
135
160
  root: string;
136
161
  label: string;
137
162
  };
163
+ link: {
164
+ root: string;
165
+ };
138
166
  };
139
167
  size: {
140
168
  xs: {
@@ -202,6 +230,28 @@ export declare const buttonStyles: import("tailwind-variants").TVReturnType<{
202
230
  root: string;
203
231
  };
204
232
  };
233
+ collapseBelow: {
234
+ sm: {
235
+ root: string;
236
+ label: string;
237
+ };
238
+ md: {
239
+ root: string;
240
+ label: string;
241
+ };
242
+ lg: {
243
+ root: string;
244
+ label: string;
245
+ };
246
+ xl: {
247
+ root: string;
248
+ label: string;
249
+ };
250
+ '2xl': {
251
+ root: string;
252
+ label: string;
253
+ };
254
+ };
205
255
  }, {
206
256
  root: string;
207
257
  label: string;
@@ -220,6 +270,9 @@ export declare const buttonStyles: import("tailwind-variants").TVReturnType<{
220
270
  root: string;
221
271
  label: string;
222
272
  };
273
+ link: {
274
+ root: string;
275
+ };
223
276
  };
224
277
  size: {
225
278
  xs: {
@@ -287,6 +340,28 @@ export declare const buttonStyles: import("tailwind-variants").TVReturnType<{
287
340
  root: string;
288
341
  };
289
342
  };
343
+ collapseBelow: {
344
+ sm: {
345
+ root: string;
346
+ label: string;
347
+ };
348
+ md: {
349
+ root: string;
350
+ label: string;
351
+ };
352
+ lg: {
353
+ root: string;
354
+ label: string;
355
+ };
356
+ xl: {
357
+ root: string;
358
+ label: string;
359
+ };
360
+ '2xl': {
361
+ root: string;
362
+ label: string;
363
+ };
364
+ };
290
365
  }, {
291
366
  root: string;
292
367
  label: string;
@@ -60,7 +60,8 @@ var buttonStyles = tv({
60
60
  list: {
61
61
  root: "p-3 px-3 rounded-rui-sm w-full justify-start text-left",
62
62
  label: "w-full leading-4"
63
- }
63
+ },
64
+ link: { root: "inline-flex align-baseline gap-x-1 underline-offset-2 not-disabled:hover:underline" }
64
65
  },
65
66
  size: {
66
67
  "xs": { root: "px-2 py-[0.125rem] text-[.75rem] leading-4 ![--rui-icon-size:0.75rem]" },
@@ -91,7 +92,29 @@ var buttonStyles = tv({
91
92
  true: { root: "relative !cursor-progress" },
92
93
  false: {}
93
94
  },
94
- hideFocusIndicator: { true: { root: "focus-visible:!outline-hidden" } }
95
+ hideFocusIndicator: { true: { root: "focus-visible:!outline-hidden" } },
96
+ collapseBelow: {
97
+ "sm": {
98
+ root: "max-sm:gap-x-0 max-sm:p-(--rui-btn-collapsed-p) max-sm:![--rui-icon-size:var(--rui-btn-collapsed-icon)]",
99
+ label: "max-sm:sr-only"
100
+ },
101
+ "md": {
102
+ root: "max-md:gap-x-0 max-md:p-(--rui-btn-collapsed-p) max-md:![--rui-icon-size:var(--rui-btn-collapsed-icon)]",
103
+ label: "max-md:sr-only"
104
+ },
105
+ "lg": {
106
+ root: "max-lg:gap-x-0 max-lg:p-(--rui-btn-collapsed-p) max-lg:![--rui-icon-size:var(--rui-btn-collapsed-icon)]",
107
+ label: "max-lg:sr-only"
108
+ },
109
+ "xl": {
110
+ root: "max-xl:gap-x-0 max-xl:p-(--rui-btn-collapsed-p) max-xl:![--rui-icon-size:var(--rui-btn-collapsed-icon)]",
111
+ label: "max-xl:sr-only"
112
+ },
113
+ "2xl": {
114
+ root: "max-2xl:gap-x-0 max-2xl:p-(--rui-btn-collapsed-p) max-2xl:![--rui-icon-size:var(--rui-btn-collapsed-icon)]",
115
+ label: "max-2xl:sr-only"
116
+ }
117
+ }
95
118
  },
96
119
  compoundVariants: [
97
120
  {
@@ -125,7 +148,7 @@ var buttonStyles = tv({
125
148
  },
126
149
  {
127
150
  loading: false,
128
- variant: "text",
151
+ variant: ["text", "link"],
129
152
  class: { root: "disabled:!bg-transparent dark:disabled:!bg-transparent disabled:active:!bg-transparent" }
130
153
  },
131
154
  {
@@ -165,7 +188,7 @@ var buttonStyles = tv({
165
188
  {
166
189
  color: "grey",
167
190
  variant: "text",
168
- class: { root: "text-rui-text-secondary" }
191
+ class: { root: "text-rui-text-secondary dark:text-rui-text-secondary" }
169
192
  },
170
193
  {
171
194
  color: "primary",
@@ -425,6 +448,114 @@ var buttonStyles = tv({
425
448
  icon: true,
426
449
  size: "sm",
427
450
  class: { root: "px-2 py-2" }
451
+ },
452
+ {
453
+ collapseBelow: [
454
+ "sm",
455
+ "md",
456
+ "lg",
457
+ "xl",
458
+ "2xl"
459
+ ],
460
+ class: { root: "[--rui-btn-collapsed-p:0.5rem] [--rui-btn-collapsed-icon:1.25rem]" }
461
+ },
462
+ {
463
+ collapseBelow: [
464
+ "sm",
465
+ "md",
466
+ "lg",
467
+ "xl",
468
+ "2xl"
469
+ ],
470
+ size: "xs",
471
+ class: { root: "[--rui-btn-collapsed-p:0.1875rem] [--rui-btn-collapsed-icon:0.875rem]" }
472
+ },
473
+ {
474
+ collapseBelow: [
475
+ "sm",
476
+ "md",
477
+ "lg",
478
+ "xl",
479
+ "2xl"
480
+ ],
481
+ size: "sm",
482
+ class: { root: "[--rui-btn-collapsed-p:0.25rem] [--rui-btn-collapsed-icon:1.25rem]" }
483
+ },
484
+ {
485
+ collapseBelow: [
486
+ "sm",
487
+ "md",
488
+ "lg",
489
+ "xl",
490
+ "2xl"
491
+ ],
492
+ size: "lg",
493
+ class: { root: "[--rui-btn-collapsed-p:0.375rem] [--rui-btn-collapsed-icon:1.5rem]" }
494
+ },
495
+ {
496
+ collapseBelow: [
497
+ "sm",
498
+ "md",
499
+ "lg",
500
+ "xl",
501
+ "2xl"
502
+ ],
503
+ size: "xl",
504
+ class: { root: "[--rui-btn-collapsed-p:0.5rem] [--rui-btn-collapsed-icon:1.5rem]" }
505
+ },
506
+ {
507
+ collapseBelow: [
508
+ "sm",
509
+ "md",
510
+ "lg",
511
+ "xl",
512
+ "2xl"
513
+ ],
514
+ size: "2xl",
515
+ class: { root: "[--rui-btn-collapsed-p:0.5rem] [--rui-btn-collapsed-icon:1.75rem]" }
516
+ },
517
+ {
518
+ variant: "link",
519
+ class: { root: [
520
+ "p-0 text-[length:inherit] leading-[inherit] ![--rui-icon-size:1em]",
521
+ "bg-transparent hover:bg-transparent active:bg-transparent",
522
+ "dark:bg-transparent dark:hover:bg-transparent dark:active:bg-transparent"
523
+ ].join(" ") }
524
+ },
525
+ {
526
+ color: "grey",
527
+ variant: "link",
528
+ class: { root: "text-rui-text dark:text-rui-text" }
529
+ },
530
+ {
531
+ color: "primary",
532
+ variant: "link",
533
+ class: { root: "text-rui-primary dark:text-rui-primary-lighter" }
534
+ },
535
+ {
536
+ color: "secondary",
537
+ variant: "link",
538
+ class: { root: "text-rui-secondary dark:text-rui-secondary-lighter" }
539
+ },
540
+ {
541
+ color: "error",
542
+ variant: "link",
543
+ class: { root: "text-rui-error dark:text-rui-error-lighter" }
544
+ },
545
+ {
546
+ color: "warning",
547
+ variant: "link",
548
+ class: { root: "text-rui-warning dark:text-rui-warning" }
549
+ },
550
+ {
551
+ color: "info",
552
+ variant: "link",
553
+ class: { root: "text-rui-info dark:text-rui-info" }
554
+ },
555
+ {
556
+ color: "success",
557
+ variant: "link",
558
+ class: { root: "text-rui-success dark:text-rui-success" }
428
559
  }
429
560
  ],
430
561
  compoundSlots: [