@vue-interface/badge 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.
package/dist/badge.js ADDED
@@ -0,0 +1,57 @@
1
+ import { createElementBlock as l, openBlock as n, createElementVNode as i, defineComponent as d, normalizeClass as u, createCommentVNode as f, renderSlot as c, createVNode as m, unref as k } from "vue";
2
+ function g(e, s) {
3
+ return n(), l("svg", {
4
+ xmlns: "http://www.w3.org/2000/svg",
5
+ fill: "none",
6
+ viewBox: "0 0 24 24",
7
+ "stroke-width": "1.5",
8
+ stroke: "currentColor",
9
+ "aria-hidden": "true",
10
+ "data-slot": "icon"
11
+ }, [
12
+ i("path", {
13
+ "stroke-linecap": "round",
14
+ "stroke-linejoin": "round",
15
+ d: "M6 18 18 6M6 6l12 12"
16
+ })
17
+ ]);
18
+ }
19
+ const b = /* @__PURE__ */ d({
20
+ __name: "Badge",
21
+ props: {
22
+ closeable: { type: Boolean, default: !1 },
23
+ closeLeft: { type: Boolean, default: !1 },
24
+ size: { default: "badge-md" }
25
+ },
26
+ emits: ["click", "close"],
27
+ setup(e, { emit: s }) {
28
+ const a = s;
29
+ return (r, o) => (n(), l("div", {
30
+ class: u(["badge", [
31
+ e.size,
32
+ { "close-left": e.closeLeft }
33
+ ]])
34
+ }, [
35
+ i("div", {
36
+ class: "badge-inner",
37
+ onClick: o[0] || (o[0] = (t) => a("click", t))
38
+ }, [
39
+ c(r.$slots, "default")
40
+ ]),
41
+ e.closeable ? (n(), l("button", {
42
+ key: 0,
43
+ type: "button",
44
+ class: "badge-close",
45
+ onClick: o[1] || (o[1] = (t) => a("close", t))
46
+ }, [
47
+ c(r.$slots, "close-icon", {}, () => [
48
+ m(k(g))
49
+ ])
50
+ ])) : f("", !0)
51
+ ], 2));
52
+ }
53
+ });
54
+ export {
55
+ b as Badge
56
+ };
57
+ //# sourceMappingURL=badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.js","sources":["../../../node_modules/.pnpm/@heroicons+vue@2.2.0_vue@3.5.26_typescript@5.9.3_/node_modules/@heroicons/vue/24/outline/esm/XMarkIcon.js","../src/Badge.vue"],"sourcesContent":["import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M6 18 18 6M6 6l12 12\"\n })\n ]))\n}","<script setup lang=\"ts\">\nimport { XMarkIcon } from '@heroicons/vue/24/outline';\nimport type { ComponentSize } from './sizes';\n\nexport type BadgeSizePrefix = 'badge';\n\nwithDefaults(defineProps<{\n closeable?: boolean;\n closeLeft?: boolean;\n size?: ComponentSize<BadgeSizePrefix>;\n}>(), {\n closeable: false,\n closeLeft: false,\n size: 'badge-md'\n});\n\ndefineSlots<{\n default: [];\n 'close-icon': [];\n}>();\n\nconst emit = defineEmits<{\n click: [e: PointerEvent];\n close: [e: PointerEvent];\n}>();\n</script>\n\n<template>\n <div \n class=\"badge\" \n :class=\"[\n size, \n { 'close-left': closeLeft }\n ]\">\n <div\n class=\"badge-inner\"\n @click=\"emit('click', $event)\">\n <slot />\n </div>\n <button\n v-if=\"closeable\"\n type=\"button\"\n class=\"badge-close\" \n @click=\"emit('close', $event)\">\n <slot name=\"close-icon\">\n <XMarkIcon />\n </slot>\n </button>\n </div>\n</template>"],"names":["render","_ctx","_cache","_openBlock","_createElementBlock","_createElementVNode","emit","__emit","__props","$event","_renderSlot","_createVNode","_unref","XMarkIcon"],"mappings":";AAEe,SAASA,EAAOC,GAAMC,GAAQ;AAC3C,SAAQC,EAAU,GAAIC,EAAoB,OAAO;AAAA,IAC/C,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,aAAa;AAAA,EACjB,GAAK;AAAA,IACDC,EAAoB,QAAQ;AAAA,MAC1B,kBAAkB;AAAA,MAClB,mBAAmB;AAAA,MACnB,GAAG;AAAA,IACT,CAAK;AAAA,EACL,CAAG;AACH;;;;;;;;;;ACGA,UAAMC,IAAOC;2BAOTH,EAoBM,OAAA;AAAA,MAnBF,UAAM,SAAO;AAAA,QACSI,EAAA;AAAA,wBAAmCA,EAAA,UAAA;AAAA,MAAS;;MAIlEH,EAIM,OAAA;AAAA,QAHF,OAAM;AAAA,QACL,SAAKH,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAO,MAAEH,EAAI,SAAUG,CAAM;AAAA,MAAA;QAC5BC,EAAQT,EAAA,QAAA,SAAA;AAAA,MAAA;MAGFO,EAAA,kBADVJ,EAQS,UAAA;AAAA;QANL,MAAK;AAAA,QACL,OAAM;AAAA,QACL,SAAKF,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAO,MAAEH,EAAI,SAAUG,CAAM;AAAA,MAAA;QAC5BC,EAEOT,4BAFP,MAEO;AAAA,UADHU,EAAaC,EAAAC,CAAA,CAAA;AAAA,QAAA;;;;;","x_google_ignoreList":[0]}
@@ -0,0 +1,2 @@
1
+ (function(t,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(t=typeof globalThis<"u"?globalThis:t||self,e(t.Badge={},t.Vue))})(this,(function(t,e){"use strict";function r(o,s){return e.openBlock(),e.createElementBlock("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M6 18 18 6M6 6l12 12"})])}const c=e.defineComponent({__name:"Badge",props:{closeable:{type:Boolean,default:!1},closeLeft:{type:Boolean,default:!1},size:{default:"badge-md"}},emits:["click","close"],setup(o,{emit:s}){const i=s;return(d,n)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["badge",[o.size,{"close-left":o.closeLeft}]])},[e.createElementVNode("div",{class:"badge-inner",onClick:n[0]||(n[0]=l=>i("click",l))},[e.renderSlot(d.$slots,"default")]),o.closeable?(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",class:"badge-close",onClick:n[1]||(n[1]=l=>i("close",l))},[e.renderSlot(d.$slots,"close-icon",{},()=>[e.createVNode(e.unref(r))])])):e.createCommentVNode("",!0)],2))}});t.Badge=c,Object.defineProperty(t,Symbol.toStringTag,{value:"Module"})}));
2
+ //# sourceMappingURL=badge.umd.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.umd.cjs","sources":["../../../node_modules/.pnpm/@heroicons+vue@2.2.0_vue@3.5.26_typescript@5.9.3_/node_modules/@heroicons/vue/24/outline/esm/XMarkIcon.js","../src/Badge.vue"],"sourcesContent":["import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"1.5\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M6 18 18 6M6 6l12 12\"\n })\n ]))\n}","<script setup lang=\"ts\">\nimport { XMarkIcon } from '@heroicons/vue/24/outline';\nimport type { ComponentSize } from './sizes';\n\nexport type BadgeSizePrefix = 'badge';\n\nwithDefaults(defineProps<{\n closeable?: boolean;\n closeLeft?: boolean;\n size?: ComponentSize<BadgeSizePrefix>;\n}>(), {\n closeable: false,\n closeLeft: false,\n size: 'badge-md'\n});\n\ndefineSlots<{\n default: [];\n 'close-icon': [];\n}>();\n\nconst emit = defineEmits<{\n click: [e: PointerEvent];\n close: [e: PointerEvent];\n}>();\n</script>\n\n<template>\n <div \n class=\"badge\" \n :class=\"[\n size, \n { 'close-left': closeLeft }\n ]\">\n <div\n class=\"badge-inner\"\n @click=\"emit('click', $event)\">\n <slot />\n </div>\n <button\n v-if=\"closeable\"\n type=\"button\"\n class=\"badge-close\" \n @click=\"emit('close', $event)\">\n <slot name=\"close-icon\">\n <XMarkIcon />\n </slot>\n </button>\n </div>\n</template>"],"names":["render","_ctx","_cache","_openBlock","_createElementBlock","_createElementVNode","emit","__emit","__props","$event","_renderSlot","_createVNode","_unref","XMarkIcon"],"mappings":"2PAEe,SAASA,EAAOC,EAAMC,EAAQ,CAC3C,OAAQC,EAAAA,UAAU,EAAIC,EAAAA,mBAAoB,MAAO,CAC/C,MAAO,6BACP,KAAM,OACN,QAAS,YACT,eAAgB,MAChB,OAAQ,eACR,cAAe,OACf,YAAa,MACjB,EAAK,CACDC,EAAAA,mBAAoB,OAAQ,CAC1B,iBAAkB,QAClB,kBAAmB,QACnB,EAAG,sBACT,CAAK,CACL,CAAG,CACH,+LCGA,MAAMC,EAAOC,8BAOTH,EAAAA,mBAoBM,MAAA,CAnBF,wBAAM,QAAO,CACSI,EAAA,mBAAmCA,EAAA,SAAA,CAAS,MAIlEH,EAAAA,mBAIM,MAAA,CAHF,MAAM,cACL,QAAKH,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAO,GAAEH,EAAI,QAAUG,CAAM,EAAA,GAC5BC,aAAQT,EAAA,OAAA,SAAA,CAAA,GAGFO,EAAA,yBADVJ,EAAAA,mBAQS,SAAA,OANL,KAAK,SACL,MAAM,cACL,QAAKF,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAO,GAAEH,EAAI,QAAUG,CAAM,EAAA,GAC5BC,EAAAA,WAEOT,yBAFP,IAEO,CADHU,EAAAA,YAAaC,EAAAA,MAAAC,CAAA,CAAA,CAAA","x_google_ignoreList":[0]}
@@ -0,0 +1,2 @@
1
+ import { default as Badge } from './src/Badge.vue';
2
+ export { Badge, };
@@ -0,0 +1,38 @@
1
+ import { ComponentSize } from './sizes';
2
+ export type BadgeSizePrefix = 'badge';
3
+ type __VLS_Props = {
4
+ closeable?: boolean;
5
+ closeLeft?: boolean;
6
+ size?: ComponentSize<BadgeSizePrefix>;
7
+ };
8
+ declare function __VLS_template(): {
9
+ attrs: Partial<{}>;
10
+ slots: Readonly<{
11
+ default: [];
12
+ 'close-icon': [];
13
+ }> & {
14
+ default: [];
15
+ 'close-icon': [];
16
+ };
17
+ refs: {};
18
+ rootEl: HTMLDivElement;
19
+ };
20
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
21
+ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
22
+ click: (e: PointerEvent) => any;
23
+ close: (e: PointerEvent) => any;
24
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
25
+ onClick?: ((e: PointerEvent) => any) | undefined;
26
+ onClose?: ((e: PointerEvent) => any) | undefined;
27
+ }>, {
28
+ closeable: boolean;
29
+ closeLeft: boolean;
30
+ size: ComponentSize<BadgeSizePrefix>;
31
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
32
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
33
+ export default _default;
34
+ type __VLS_WithTemplateSlots<T, S> = T & {
35
+ new (): {
36
+ $slots: S;
37
+ };
38
+ };
@@ -0,0 +1,9 @@
1
+ export type PredeterminedSize = '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl';
2
+ export type Unit = 'px' | 'rem' | 'em' | 'vw' | 'vh' | '%' | 'ch' | 'ex' | 'cm' | 'mm' | 'in' | 'pt' | 'pc';
3
+ export type NumericWithUnit = `${number}${Unit}`;
4
+ export type CalcExpressionChar = number | '.' | '+' | '-' | '*' | '/' | '(' | ')' | '_';
5
+ export type NonEmptyCalcContentString = `${CalcExpressionChar}${string}` | CalcExpressionChar;
6
+ export type ValidCalc = `calc(${NonEmptyCalcContentString})`;
7
+ export type ValidBracketContent = NumericWithUnit | ValidCalc;
8
+ export type ComponentSizeValue<Prefix extends string, Value extends PredeterminedSize = PredeterminedSize> = `${Prefix}-${Value}` | `${Prefix}-${number}` | `${Prefix}-[${ValidBracketContent}]`;
9
+ export type ComponentSize<Prefix extends string, Value extends PredeterminedSize = PredeterminedSize> = ComponentSizeValue<Prefix, Value> | Partial<Record<ComponentSizeValue<Prefix, Value>, boolean>>;
@@ -0,0 +1,3 @@
1
+ import { ConfigEnv } from 'vite';
2
+ declare const _default: ({ command }: ConfigEnv) => import('vite').UserConfig;
3
+ export default _default;
package/index.css CHANGED
@@ -1,6 +1,6 @@
1
1
  @import 'tailwindcss';
2
2
 
3
- @import './src/sizes.css';
4
- @import './src/colors.css';
3
+ @import './src/css/sizes.css';
4
+ @import './src/css/colors.css';
5
5
 
6
- @import './src/badge.css';
6
+ @import './src/css/badge.css';
package/index.ts ADDED
@@ -0,0 +1,5 @@
1
+ import Badge from './src/Badge.vue';
2
+
3
+ export {
4
+ Badge,
5
+ };
package/package.json CHANGED
@@ -1,10 +1,20 @@
1
1
  {
2
2
  "name": "@vue-interface/badge",
3
- "version": "3.0.0",
4
- "description": "A TailwindCSS badge utility.",
3
+ "version": "3.1.0",
4
+ "description": "A Vue badge utility.",
5
5
  "type": "module",
6
- "main": "./index.css",
7
- "module": "./index.css",
6
+ "main": "./dist/badge.umd.cjs",
7
+ "module": "./dist/badge.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "source": "./index.ts",
12
+ "types": "./dist/index.d.ts",
13
+ "style": "./index.css",
14
+ "import": "./dist/badge.js",
15
+ "require": "./dist/badge.umd.cjs"
16
+ }
17
+ },
8
18
  "browserslist": "last 2 versions, > 0.5%, ie >= 11",
9
19
  "repository": {
10
20
  "type": "git",
@@ -13,6 +23,7 @@
13
23
  "keywords": [
14
24
  "Badge",
15
25
  "Component",
26
+ "Vue",
16
27
  "Tailwind",
17
28
  "Bootstrap"
18
29
  ],
@@ -25,12 +36,18 @@
25
36
  "readme": "README.md",
26
37
  "files": [
27
38
  "src",
39
+ "dist",
40
+ "index.ts",
28
41
  "index.css",
29
42
  "README.md",
30
43
  "LICENSE"
31
44
  ],
45
+ "peerDependencies": {
46
+ "vue": "^3.3.4"
47
+ },
32
48
  "scripts": {
33
49
  "dev": "vite",
50
+ "build": "vue-tsc && vite build",
34
51
  "preview": "vite preview"
35
52
  }
36
53
  }
package/src/Badge.vue ADDED
@@ -0,0 +1,50 @@
1
+ <script setup lang="ts">
2
+ import { XMarkIcon } from '@heroicons/vue/24/outline';
3
+ import type { ComponentSize } from './sizes';
4
+
5
+ export type BadgeSizePrefix = 'badge';
6
+
7
+ withDefaults(defineProps<{
8
+ closeable?: boolean;
9
+ closeLeft?: boolean;
10
+ size?: ComponentSize<BadgeSizePrefix>;
11
+ }>(), {
12
+ closeable: false,
13
+ closeLeft: false,
14
+ size: 'badge-md'
15
+ });
16
+
17
+ defineSlots<{
18
+ default: [];
19
+ 'close-icon': [];
20
+ }>();
21
+
22
+ const emit = defineEmits<{
23
+ click: [e: PointerEvent];
24
+ close: [e: PointerEvent];
25
+ }>();
26
+ </script>
27
+
28
+ <template>
29
+ <div
30
+ class="badge"
31
+ :class="[
32
+ size,
33
+ { 'close-left': closeLeft }
34
+ ]">
35
+ <div
36
+ class="badge-inner"
37
+ @click="emit('click', $event)">
38
+ <slot />
39
+ </div>
40
+ <button
41
+ v-if="closeable"
42
+ type="button"
43
+ class="badge-close"
44
+ @click="emit('close', $event)">
45
+ <slot name="close-icon">
46
+ <XMarkIcon />
47
+ </slot>
48
+ </button>
49
+ </div>
50
+ </template>
@@ -0,0 +1,142 @@
1
+ @theme {
2
+ --badge-display: inline-flex;
3
+ --badge-align-items: stretch;
4
+ --badge-justify-content: space-between;
5
+ --badge-overflow: hidden;
6
+ --badge-text-decoration: none;
7
+ --badge-gap: calc(1em * var(--badge-padding-x) / 2);
8
+ --badge-border-radius: --spacing(1);
9
+ --badge-font-size: --spacing(4);
10
+ --badge-color: var(--badge-text-default);
11
+ --badge-background-color: var(--badge-primary);
12
+ --badge-padding-y: .25;
13
+ --badge-padding-x: .350;
14
+ --badge-padding-top: calc(1em * var(--badge-padding-y));
15
+ --badge-padding-bottom: calc(1em * var(--badge-padding-y));
16
+ --badge-padding-left: calc(1em * var(--badge-padding-x));
17
+ --badge-padding-right: calc(1em * var(--badge-padding-x));
18
+
19
+ --badge-close-cursor: pointer;
20
+ --badge-close-align-items: center;
21
+ --badge-close-justify-content: center;
22
+ --badge-close-dark-hover-color: var(--badge-color);
23
+ --badge-close-icon-size: 0.75em;
24
+
25
+ --badge-inner-display: inline-flex;
26
+ --badge-inner-align-items: center;
27
+ --badge-inner-justify-content: start;
28
+
29
+ /* badge-outline variables */
30
+ --badge-outline-background-color: transparent;
31
+ --badge-outline-color: var(--badge-primary, var(--color-blue-600));
32
+ }
33
+
34
+ @utility badge {
35
+ display: var(--badge-display);
36
+ align-items: var(--badge-align-items);
37
+ justify-content: var(--badge-justify-content);
38
+ font-size: var(--badge-font-size);
39
+ color: var(--badge-color);
40
+ background-color: var(--badge-background-color);
41
+ border-radius: var(--badge-border-radius);
42
+ text-decoration: var(--badge-text-decoration);
43
+ overflow: var(--badge-overflow);
44
+ gap: var(--badge-gap);
45
+
46
+ &.close-left {
47
+ .badge-close {
48
+ order: -1;
49
+ padding-left: calc(var(--badge-padding-left) / 2.5);
50
+ padding-right: calc(var(--badge-padding-right) / 2.5);
51
+ }
52
+
53
+ .badge-inner {
54
+ padding-left: 0;
55
+ padding-right: var(--badge-padding-right);
56
+ }
57
+ }
58
+
59
+ .badge-close {
60
+ display: var(--badge-inner-display);
61
+ line-height: var(--badge-font-size);
62
+ cursor: var(--badge-close-cursor);
63
+ justify-content: var(--badge-close-justify-content);
64
+ align-items: var(--badge-close-align-items);
65
+ padding-left: calc(var(--badge-padding-left) / 3.5);
66
+ padding-right: calc(var(--badge-padding-right) / 3.5);
67
+ padding-top: var(--badge-padding-top);
68
+ padding-bottom: var(--badge-padding-bottom);
69
+
70
+ & svg,
71
+ & > :first-child {
72
+ width: var(--badge-close-icon-size);
73
+ height: var(--badge-close-icon-size);
74
+ }
75
+
76
+ &:hover {
77
+ background-color: color-mix(in oklch, var(--badge-background-color) 90%, black);
78
+ }
79
+ }
80
+ }
81
+
82
+ @utility badge-inner {
83
+ display: var(--badge-inner-display);
84
+ align-items: var(--badge-inner-align-items);
85
+ justify-content: var(--badge-inner-justify-content);
86
+ line-height: var(--badge-font-size);
87
+ padding-top: var(--badge-padding-top);
88
+ padding-bottom: var(--badge-padding-bottom);
89
+ padding-left: var(--badge-padding-left);
90
+ padding-right: var(--badge-padding-right);
91
+ flex-grow: 1;
92
+
93
+ &:not(:last-child) {
94
+ padding-right: 0;
95
+ }
96
+ }
97
+
98
+ @utility badge-outline {
99
+ background-color: var(--badge-outline-background-color);
100
+ color: var(--badge-outline-color);
101
+ border: 1px solid var(--badge-outline-color);
102
+
103
+ .badge-close:hover {
104
+ background-color: color-mix(in oklch, var(--badge-background-color, oklch(54.6% 0.245 262.881)) 10%, white);
105
+
106
+ @variant dark {
107
+ background-color: var(--badge-background-color);
108
+ color: var(--badge-close-dark-hover-color);
109
+ }
110
+ }
111
+ }
112
+
113
+ @utility badge-* {
114
+ --badge-font-size: --value(--badge-font-size-*, [length]);
115
+ --badge-font-size: --spacing(--value(number));
116
+ --badge-close-icon-size: calc(--value(--badge-font-size-*) * 0.75);
117
+ --badge-close-icon-size: calc(--spacing(--value(number)) * 0.75);
118
+
119
+ border-radius: calc(var(--badge-font-size) * .25);
120
+
121
+ background-color: --value(--badge-*, --color-*, [color]);
122
+ color: --value(--badge-*-text, --text-for-*);
123
+
124
+ .badge-close:hover {
125
+ background-color: color-mix(in oklch, --value(--badge-*, --color-*, [color]) 90%, black);
126
+ }
127
+ }
128
+
129
+ @utility badge-outline-* {
130
+ background-color: var(--badge-outline-background-color);
131
+ color: --value(--badge-*, --color-*, [color]);
132
+ border: 1px solid --value(--badge-*, --color-*, [color]);
133
+
134
+ .badge-close:hover {
135
+ background-color: color-mix(in oklch, --value(--badge-*, --color-*, [color]) 10%, white);
136
+
137
+ @variant dark {
138
+ background-color: --value(--badge-*, --color-*, [color]);
139
+ color: --value(--badge-*-text, --text-for-*);
140
+ }
141
+ }
142
+ }
package/src/sizes.ts ADDED
@@ -0,0 +1,18 @@
1
+ export type PredeterminedSize = '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl';
2
+
3
+ export type Unit = 'px' | 'rem' | 'em' | 'vw' | 'vh' | '%' | 'ch' | 'ex' | 'cm' | 'mm' | 'in' | 'pt' | 'pc';
4
+ export type NumericWithUnit = `${number}${Unit}`;
5
+ export type CalcExpressionChar = number | '.' | '+' | '-' | '*' | '/' | '(' | ')' | '_'
6
+ export type NonEmptyCalcContentString = `${CalcExpressionChar}${string}` | CalcExpressionChar;
7
+ export type ValidCalc = `calc(${NonEmptyCalcContentString})`;
8
+ export type ValidBracketContent = NumericWithUnit | ValidCalc;
9
+
10
+ export type ComponentSizeValue<
11
+ Prefix extends string,
12
+ Value extends PredeterminedSize = PredeterminedSize
13
+ > = `${Prefix}-${Value}` | `${Prefix}-${number}` | `${Prefix}-[${ValidBracketContent}]`;
14
+
15
+ export type ComponentSize<
16
+ Prefix extends string,
17
+ Value extends PredeterminedSize = PredeterminedSize
18
+ > = ComponentSizeValue<Prefix, Value> | Partial<Record<ComponentSizeValue<Prefix, Value>, boolean>>;
package/src/badge.css DELETED
@@ -1,139 +0,0 @@
1
- @theme {
2
- /* badge variables */
3
- --badge-display: inline-flex;
4
- --badge-align-items: stretch;
5
- --badge-justify-content: space-between;
6
- --badge-padding-y: .25;
7
- --badge-padding-x: .350;
8
-
9
- --badge-children-display: inline-flex;
10
- --badge-children-align-items: center;
11
-
12
- --badge-close-display: inline-flex;
13
- --badge-close-icon: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3E%3Cpath%20stroke='black'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'%20d='M6%2018L18%206M6%206l12%2012'/%3E%3C/svg%3E");
14
-
15
- /* badge-outline variables */
16
- --badge-outline-background-color: transparent;
17
- --badge-outline-color: var(--badge-primary, var(--color-blue-600));
18
- }
19
-
20
- @utility badge {
21
- --badge-border-radius: --spacing(1);
22
- --badge-font-size: --spacing(4);
23
- --badge-padding-top: calc(var(--badge-font-size) * var(--badge-padding-y));
24
- --badge-padding-bottom: calc(var(--badge-font-size) * var(--badge-padding-y));
25
- --badge-padding-left: calc(var(--badge-font-size) * var(--badge-padding-x));
26
- --badge-padding-right: calc(var(--badge-font-size) * var(--badge-padding-x));
27
- --badge-gap: calc(var(--badge-font-size) * var(--badge-padding-x) / 2);
28
- --badge-color: var(--badge-text-default);
29
- --badge-background-color: var(--badge-primary);
30
- --badge-hover-color: black;
31
- --badge-hover-mix-percentage: 90%;
32
- --badge-close-hover-color: var(--badge-color);
33
- --badge-close-icon-size: calc(var(--badge-font-size) * 0.75);
34
-
35
- display: var(--badge-display);
36
- align-items: var(--badge-align-items);
37
- justify-content: var(--badge-justify-content);
38
- gap: var(--badge-gap);
39
- font-size: var(--badge-font-size);
40
- line-height: var(--badge-font-size);
41
- color: var(--badge-color);
42
- background-color: var(--badge-background-color);
43
- border-radius: var(--badge-border-radius);
44
- text-decoration: none;
45
-
46
- &:not(:has(:nth-child(1))) {
47
- padding-top: var(--badge-padding-top);
48
- padding-bottom: var(--badge-padding-bottom);
49
- padding-left: var(--badge-padding-left);
50
- padding-right: var(--badge-padding-right);
51
- }
52
-
53
- &:has(:nth-child(1)) {
54
- > * {
55
- display: var(--badge-children-display);
56
- align-items: var(--badge-children-align-items);
57
- padding-top: var(--badge-padding-top);
58
- padding-bottom: var(--badge-padding-bottom);
59
- }
60
-
61
- > :first-child {
62
- padding-left: var(--badge-padding-left);
63
- border-top-left-radius: var(--badge-border-radius);
64
- border-bottom-left-radius: var(--badge-border-radius);
65
- }
66
-
67
- > :last-child {
68
- padding-right: var(--badge-padding-right);
69
- border-top-right-radius: var(--badge-border-radius);
70
- border-bottom-right-radius: var(--badge-border-radius);
71
- }
72
-
73
- .badge-close {
74
- padding-left: calc(var(--badge-padding-left) / 3);
75
- padding-right: calc(var(--badge-padding-left) / 3);
76
-
77
-
78
- &::before {
79
- content: "";
80
- display: block;
81
- width: var(--badge-close-icon-size);
82
- height: var(--badge-close-icon-size);
83
- background-color: currentColor;
84
- -webkit-mask: var(--badge-close-icon) center / contain no-repeat;
85
- mask: var(--badge-close-icon) center / contain no-repeat;
86
- }
87
-
88
- &:hover {
89
- background-color: color-mix(in oklab, var(--badge-background-color) var(--badge-hover-mix-percentage), var(--badge-hover-color));
90
- color: var(--badge-close-hover-color);
91
- }
92
- }
93
- }
94
-
95
- }
96
-
97
- @utility badge-* {
98
- --badge-font-size: --value(--badge-font-size-*, [length]);
99
- --badge-font-size: --spacing(--value(integer));
100
- --badge-border-radius: calc(var(--badge-font-size) * .25);
101
- --badge-background-color: --value(--badge-*, --color-*, [color]);
102
- --badge-color: --value(--badge-*-text, --text-for-*);
103
- --badge-hover-color: --value(--badge-*-hover-color, --hover-color-for-*);
104
- }
105
-
106
- @utility badge-outline {
107
- --badge-background-color: var(--badge-outline-background-color);
108
- --badge-color: var(--badge-outline-color);
109
- --badge-border-color: var(--badge-outline-color);
110
- --badge-border-style: solid;
111
- --badge-border-width: 1px;
112
- --badge-hover-color: var(--badge-outline-color);
113
- --badge-hover-mix-percentage: 90%;
114
- --badge-close-hover-color: var(--badge-outline-color);
115
-
116
- @variant dark {
117
- --badge-hover-mix-percentage: 0%;
118
- --badge-close-hover-color: var(--color-white, #fff);
119
- }
120
-
121
- border: var(--badge-border-width) var(--badge-border-style) var(--badge-border-color);
122
- }
123
-
124
- @utility badge-outline-* {
125
- --badge-background-color: var(--badge-outline-background-color);
126
- --badge-color: --value(--badge-*, --color-*, [color]);
127
- --badge-border-color: --value(--badge-*, --color-*, [color]);
128
- --badge-border-style: solid;
129
- --badge-border-width: 1px;
130
- --badge-hover-color: --value(--badge-*, --color-*, [color]);
131
- --badge-hover-mix-percentage: 85%;
132
-
133
- @variant dark {
134
- --badge-hover-mix-percentage: 0%;
135
- --badge-close-hover-color: --value(--badge-*-text, --text-for-*);
136
- }
137
-
138
- border: var(--badge-border-width) var(--badge-border-style) var(--badge-border-color);
139
- }
File without changes
File without changes