Merge branch 'dev' into feature/dialog-with-scroll
This commit is contained in:
commit
60c0189392
|
|
@ -1,19 +0,0 @@
|
||||||
// const process = require('node:process')
|
|
||||||
// process.env.ESLINT_TSCONFIG = 'tsconfig.json'
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
extends: '@antfu',
|
|
||||||
|
|
||||||
rules: {
|
|
||||||
'vue/one-component-per-file': 'off',
|
|
||||||
'vue/no-reserved-component-names': 'off',
|
|
||||||
'vue/no-useless-v-bind': 'off',
|
|
||||||
'symbol-description': 'off',
|
|
||||||
'no-console': 'warn',
|
|
||||||
'no-tabs': 'off',
|
|
||||||
'no-invalid-character': 'off',
|
|
||||||
'import/first': 'off',
|
|
||||||
'@stylistic/js/no-tabs': 'off',
|
|
||||||
'n/prefer-global/process': 'off',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
14
.vscode/settings.json
vendored
14
.vscode/settings.json
vendored
|
|
@ -1,11 +1,23 @@
|
||||||
{
|
{
|
||||||
|
"eslint.experimental.useFlatConfig": true,
|
||||||
"prettier.enable": false,
|
"prettier.enable": false,
|
||||||
"editor.formatOnSave": false,
|
"editor.formatOnSave": false,
|
||||||
"editor.codeActionsOnSave": {
|
"editor.codeActionsOnSave": {
|
||||||
"source.fixAll.eslint": "explicit",
|
"source.fixAll.eslint": "explicit",
|
||||||
"source.organizeImports": "never"
|
"source.organizeImports": "never"
|
||||||
},
|
},
|
||||||
|
"eslint.rules.customizations": [
|
||||||
|
{ "rule": "style/*", "severity": "off" },
|
||||||
|
{ "rule": "format/*", "severity": "off" },
|
||||||
|
{ "rule": "*-indent", "severity": "off" },
|
||||||
|
{ "rule": "*-spacing", "severity": "off" },
|
||||||
|
{ "rule": "*-spaces", "severity": "off" },
|
||||||
|
{ "rule": "*-order", "severity": "off" },
|
||||||
|
{ "rule": "*-dangle", "severity": "off" },
|
||||||
|
{ "rule": "*-newline", "severity": "off" },
|
||||||
|
{ "rule": "*quotes", "severity": "off" },
|
||||||
|
{ "rule": "*semi", "severity": "off" }
|
||||||
|
],
|
||||||
"eslint.validate": [
|
"eslint.validate": [
|
||||||
"javascript",
|
"javascript",
|
||||||
"javascriptreact",
|
"javascriptreact",
|
||||||
|
|
|
||||||
|
|
@ -326,6 +326,12 @@ export const docsConfig: DocsConfig = {
|
||||||
href: '/docs/components/tabs',
|
href: '/docs/components/tabs',
|
||||||
items: [],
|
items: [],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: 'Tags Input',
|
||||||
|
href: '/docs/components/tags-input',
|
||||||
|
label: 'New',
|
||||||
|
items: [],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: 'Textarea',
|
title: 'Textarea',
|
||||||
href: '/docs/components/textarea',
|
href: '/docs/components/textarea',
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,12 @@
|
||||||
@import url("https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap");
|
|
||||||
@tailwind base;
|
@tailwind base;
|
||||||
@tailwind components;
|
@tailwind components;
|
||||||
@tailwind utilities;
|
@tailwind utilities;
|
||||||
|
|
||||||
@layer base {
|
@layer base {
|
||||||
:root {
|
:root {
|
||||||
|
--font-geist-sans: "geist-sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
|
||||||
|
Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||||
|
|
||||||
--background: 0 0% 100%;
|
--background: 0 0% 100%;
|
||||||
--foreground: 240 10% 3.9%;
|
--foreground: 240 10% 3.9%;
|
||||||
--card: 0 0% 100%;
|
--card: 0 0% 100%;
|
||||||
|
|
@ -68,6 +70,16 @@
|
||||||
-webkit-tap-highlight-color: rgba(128, 128, 128, 0.5);
|
-webkit-tap-highlight-color: rgba(128, 128, 128, 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Font face Geist font */
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "geist-sans";
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100 900;
|
||||||
|
font-display: swap;
|
||||||
|
src: url("/fonts/Geist/GeistVariableVF.woff2") format("woff2");
|
||||||
|
}
|
||||||
|
|
||||||
/* === Scrollbars === */
|
/* === Scrollbars === */
|
||||||
|
|
||||||
::-webkit-scrollbar {
|
::-webkit-scrollbar {
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
|
||||||
// This file is autogenerated by scripts/build-registry.ts
|
// This file is autogenerated by scripts/build-registry.ts
|
||||||
// Do not edit this file directly.
|
// Do not edit this file directly.
|
||||||
export const Index = {
|
export const Index = {
|
||||||
|
|
@ -457,6 +458,13 @@ export const Index = {
|
||||||
component: () => import('../src/lib/registry/default/example/InputWithButton.vue').then(m => m.default),
|
component: () => import('../src/lib/registry/default/example/InputWithButton.vue').then(m => m.default),
|
||||||
files: ['../src/lib/registry/default/example/InputWithButton.vue'],
|
files: ['../src/lib/registry/default/example/InputWithButton.vue'],
|
||||||
},
|
},
|
||||||
|
InputWithIcon: {
|
||||||
|
name: 'InputWithIcon',
|
||||||
|
type: 'components:example',
|
||||||
|
registryDependencies: ['input'],
|
||||||
|
component: () => import('../src/lib/registry/default/example/InputWithIcon.vue').then(m => m.default),
|
||||||
|
files: ['../src/lib/registry/default/example/InputWithIcon.vue'],
|
||||||
|
},
|
||||||
InputWithLabel: {
|
InputWithLabel: {
|
||||||
name: 'InputWithLabel',
|
name: 'InputWithLabel',
|
||||||
type: 'components:example',
|
type: 'components:example',
|
||||||
|
|
@ -646,6 +654,20 @@ export const Index = {
|
||||||
component: () => import('../src/lib/registry/default/example/TabsDemo.vue').then(m => m.default),
|
component: () => import('../src/lib/registry/default/example/TabsDemo.vue').then(m => m.default),
|
||||||
files: ['../src/lib/registry/default/example/TabsDemo.vue'],
|
files: ['../src/lib/registry/default/example/TabsDemo.vue'],
|
||||||
},
|
},
|
||||||
|
TagsInputComboboxDemo: {
|
||||||
|
name: 'TagsInputComboboxDemo',
|
||||||
|
type: 'components:example',
|
||||||
|
registryDependencies: ['command', 'tags-input'],
|
||||||
|
component: () => import('../src/lib/registry/default/example/TagsInputComboboxDemo.vue').then(m => m.default),
|
||||||
|
files: ['../src/lib/registry/default/example/TagsInputComboboxDemo.vue'],
|
||||||
|
},
|
||||||
|
TagsInputDemo: {
|
||||||
|
name: 'TagsInputDemo',
|
||||||
|
type: 'components:example',
|
||||||
|
registryDependencies: ['tags-input'],
|
||||||
|
component: () => import('../src/lib/registry/default/example/TagsInputDemo.vue').then(m => m.default),
|
||||||
|
files: ['../src/lib/registry/default/example/TagsInputDemo.vue'],
|
||||||
|
},
|
||||||
TextareaDemo: {
|
TextareaDemo: {
|
||||||
name: 'TextareaDemo',
|
name: 'TextareaDemo',
|
||||||
type: 'components:example',
|
type: 'components:example',
|
||||||
|
|
@ -818,96 +840,96 @@ export const Index = {
|
||||||
name: 'TypographyBlockquote',
|
name: 'TypographyBlockquote',
|
||||||
type: 'components:example',
|
type: 'components:example',
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/default/example/TypographyBlockquote.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/default/example/TypographyBlockquote.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/default/example/TypographyBlockquote.vue'],
|
files: ["../src/lib/registry/default/example/TypographyBlockquote.vue"],
|
||||||
},
|
},
|
||||||
TypographyDemo: {
|
"TypographyDemo": {
|
||||||
name: 'TypographyDemo',
|
name: "TypographyDemo",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/default/example/TypographyDemo.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/default/example/TypographyDemo.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/default/example/TypographyDemo.vue'],
|
files: ["../src/lib/registry/default/example/TypographyDemo.vue"],
|
||||||
},
|
},
|
||||||
TypographyH1: {
|
"TypographyH1": {
|
||||||
name: 'TypographyH1',
|
name: "TypographyH1",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/default/example/TypographyH1.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/default/example/TypographyH1.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/default/example/TypographyH1.vue'],
|
files: ["../src/lib/registry/default/example/TypographyH1.vue"],
|
||||||
},
|
},
|
||||||
TypographyH2: {
|
"TypographyH2": {
|
||||||
name: 'TypographyH2',
|
name: "TypographyH2",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/default/example/TypographyH2.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/default/example/TypographyH2.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/default/example/TypographyH2.vue'],
|
files: ["../src/lib/registry/default/example/TypographyH2.vue"],
|
||||||
},
|
},
|
||||||
TypographyH3: {
|
"TypographyH3": {
|
||||||
name: 'TypographyH3',
|
name: "TypographyH3",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/default/example/TypographyH3.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/default/example/TypographyH3.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/default/example/TypographyH3.vue'],
|
files: ["../src/lib/registry/default/example/TypographyH3.vue"],
|
||||||
},
|
},
|
||||||
TypographyH4: {
|
"TypographyH4": {
|
||||||
name: 'TypographyH4',
|
name: "TypographyH4",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/default/example/TypographyH4.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/default/example/TypographyH4.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/default/example/TypographyH4.vue'],
|
files: ["../src/lib/registry/default/example/TypographyH4.vue"],
|
||||||
},
|
},
|
||||||
TypographyInlineCode: {
|
"TypographyInlineCode": {
|
||||||
name: 'TypographyInlineCode',
|
name: "TypographyInlineCode",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/default/example/TypographyInlineCode.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/default/example/TypographyInlineCode.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/default/example/TypographyInlineCode.vue'],
|
files: ["../src/lib/registry/default/example/TypographyInlineCode.vue"],
|
||||||
},
|
},
|
||||||
TypographyLarge: {
|
"TypographyLarge": {
|
||||||
name: 'TypographyLarge',
|
name: "TypographyLarge",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/default/example/TypographyLarge.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/default/example/TypographyLarge.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/default/example/TypographyLarge.vue'],
|
files: ["../src/lib/registry/default/example/TypographyLarge.vue"],
|
||||||
},
|
},
|
||||||
TypographyLead: {
|
"TypographyLead": {
|
||||||
name: 'TypographyLead',
|
name: "TypographyLead",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/default/example/TypographyLead.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/default/example/TypographyLead.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/default/example/TypographyLead.vue'],
|
files: ["../src/lib/registry/default/example/TypographyLead.vue"],
|
||||||
},
|
},
|
||||||
TypographyList: {
|
"TypographyList": {
|
||||||
name: 'TypographyList',
|
name: "TypographyList",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/default/example/TypographyList.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/default/example/TypographyList.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/default/example/TypographyList.vue'],
|
files: ["../src/lib/registry/default/example/TypographyList.vue"],
|
||||||
},
|
},
|
||||||
TypographyMuted: {
|
"TypographyMuted": {
|
||||||
name: 'TypographyMuted',
|
name: "TypographyMuted",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/default/example/TypographyMuted.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/default/example/TypographyMuted.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/default/example/TypographyMuted.vue'],
|
files: ["../src/lib/registry/default/example/TypographyMuted.vue"],
|
||||||
},
|
},
|
||||||
TypographyP: {
|
"TypographyP": {
|
||||||
name: 'TypographyP',
|
name: "TypographyP",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/default/example/TypographyP.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/default/example/TypographyP.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/default/example/TypographyP.vue'],
|
files: ["../src/lib/registry/default/example/TypographyP.vue"],
|
||||||
},
|
},
|
||||||
TypographySmall: {
|
"TypographySmall": {
|
||||||
name: 'TypographySmall',
|
name: "TypographySmall",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/default/example/TypographySmall.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/default/example/TypographySmall.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/default/example/TypographySmall.vue'],
|
files: ["../src/lib/registry/default/example/TypographySmall.vue"],
|
||||||
},
|
},
|
||||||
TypographyTable: {
|
"TypographyTable": {
|
||||||
name: 'TypographyTable',
|
name: "TypographyTable",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/default/example/TypographyTable.vue').then(m => m.default),
|
component: () => import('../src/lib/registry/default/example/TypographyTable.vue').then(m => m.default),
|
||||||
files: ['../src/lib/registry/default/example/TypographyTable.vue'],
|
files: ['../src/lib/registry/default/example/TypographyTable.vue'],
|
||||||
|
|
@ -1390,6 +1412,13 @@ export const Index = {
|
||||||
component: () => import('../src/lib/registry/new-york/example/InputWithButton.vue').then(m => m.default),
|
component: () => import('../src/lib/registry/new-york/example/InputWithButton.vue').then(m => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/InputWithButton.vue'],
|
files: ['../src/lib/registry/new-york/example/InputWithButton.vue'],
|
||||||
},
|
},
|
||||||
|
InputWithIcon: {
|
||||||
|
name: 'InputWithIcon',
|
||||||
|
type: 'components:example',
|
||||||
|
registryDependencies: ['input'],
|
||||||
|
component: () => import('../src/lib/registry/new-york/example/InputWithIcon.vue').then(m => m.default),
|
||||||
|
files: ['../src/lib/registry/new-york/example/InputWithIcon.vue'],
|
||||||
|
},
|
||||||
InputWithLabel: {
|
InputWithLabel: {
|
||||||
name: 'InputWithLabel',
|
name: 'InputWithLabel',
|
||||||
type: 'components:example',
|
type: 'components:example',
|
||||||
|
|
@ -1579,6 +1608,20 @@ export const Index = {
|
||||||
component: () => import('../src/lib/registry/new-york/example/TabsDemo.vue').then(m => m.default),
|
component: () => import('../src/lib/registry/new-york/example/TabsDemo.vue').then(m => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/TabsDemo.vue'],
|
files: ['../src/lib/registry/new-york/example/TabsDemo.vue'],
|
||||||
},
|
},
|
||||||
|
TagsInputComboboxDemo: {
|
||||||
|
name: 'TagsInputComboboxDemo',
|
||||||
|
type: 'components:example',
|
||||||
|
registryDependencies: ['command', 'tags-input'],
|
||||||
|
component: () => import('../src/lib/registry/new-york/example/TagsInputComboboxDemo.vue').then(m => m.default),
|
||||||
|
files: ['../src/lib/registry/new-york/example/TagsInputComboboxDemo.vue'],
|
||||||
|
},
|
||||||
|
TagsInputDemo: {
|
||||||
|
name: 'TagsInputDemo',
|
||||||
|
type: 'components:example',
|
||||||
|
registryDependencies: ['tags-input'],
|
||||||
|
component: () => import('../src/lib/registry/new-york/example/TagsInputDemo.vue').then(m => m.default),
|
||||||
|
files: ['../src/lib/registry/new-york/example/TagsInputDemo.vue'],
|
||||||
|
},
|
||||||
TextareaDemo: {
|
TextareaDemo: {
|
||||||
name: 'TextareaDemo',
|
name: 'TextareaDemo',
|
||||||
type: 'components:example',
|
type: 'components:example',
|
||||||
|
|
@ -1751,120 +1794,120 @@ export const Index = {
|
||||||
name: 'TypographyBlockquote',
|
name: 'TypographyBlockquote',
|
||||||
type: 'components:example',
|
type: 'components:example',
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/new-york/example/TypographyBlockquote.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/new-york/example/TypographyBlockquote.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/TypographyBlockquote.vue'],
|
files: ["../src/lib/registry/new-york/example/TypographyBlockquote.vue"],
|
||||||
},
|
},
|
||||||
TypographyDemo: {
|
"TypographyDemo": {
|
||||||
name: 'TypographyDemo',
|
name: "TypographyDemo",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/new-york/example/TypographyDemo.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/new-york/example/TypographyDemo.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/TypographyDemo.vue'],
|
files: ["../src/lib/registry/new-york/example/TypographyDemo.vue"],
|
||||||
},
|
},
|
||||||
TypographyH1: {
|
"TypographyH1": {
|
||||||
name: 'TypographyH1',
|
name: "TypographyH1",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/new-york/example/TypographyH1.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/new-york/example/TypographyH1.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/TypographyH1.vue'],
|
files: ["../src/lib/registry/new-york/example/TypographyH1.vue"],
|
||||||
},
|
},
|
||||||
TypographyH2: {
|
"TypographyH2": {
|
||||||
name: 'TypographyH2',
|
name: "TypographyH2",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/new-york/example/TypographyH2.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/new-york/example/TypographyH2.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/TypographyH2.vue'],
|
files: ["../src/lib/registry/new-york/example/TypographyH2.vue"],
|
||||||
},
|
},
|
||||||
TypographyH3: {
|
"TypographyH3": {
|
||||||
name: 'TypographyH3',
|
name: "TypographyH3",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/new-york/example/TypographyH3.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/new-york/example/TypographyH3.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/TypographyH3.vue'],
|
files: ["../src/lib/registry/new-york/example/TypographyH3.vue"],
|
||||||
},
|
},
|
||||||
TypographyH4: {
|
"TypographyH4": {
|
||||||
name: 'TypographyH4',
|
name: "TypographyH4",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/new-york/example/TypographyH4.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/new-york/example/TypographyH4.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/TypographyH4.vue'],
|
files: ["../src/lib/registry/new-york/example/TypographyH4.vue"],
|
||||||
},
|
},
|
||||||
TypographyInlineCode: {
|
"TypographyInlineCode": {
|
||||||
name: 'TypographyInlineCode',
|
name: "TypographyInlineCode",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/new-york/example/TypographyInlineCode.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/new-york/example/TypographyInlineCode.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/TypographyInlineCode.vue'],
|
files: ["../src/lib/registry/new-york/example/TypographyInlineCode.vue"],
|
||||||
},
|
},
|
||||||
TypographyLarge: {
|
"TypographyLarge": {
|
||||||
name: 'TypographyLarge',
|
name: "TypographyLarge",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/new-york/example/TypographyLarge.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/new-york/example/TypographyLarge.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/TypographyLarge.vue'],
|
files: ["../src/lib/registry/new-york/example/TypographyLarge.vue"],
|
||||||
},
|
},
|
||||||
TypographyLead: {
|
"TypographyLead": {
|
||||||
name: 'TypographyLead',
|
name: "TypographyLead",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/new-york/example/TypographyLead.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/new-york/example/TypographyLead.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/TypographyLead.vue'],
|
files: ["../src/lib/registry/new-york/example/TypographyLead.vue"],
|
||||||
},
|
},
|
||||||
TypographyList: {
|
"TypographyList": {
|
||||||
name: 'TypographyList',
|
name: "TypographyList",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/new-york/example/TypographyList.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/new-york/example/TypographyList.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/TypographyList.vue'],
|
files: ["../src/lib/registry/new-york/example/TypographyList.vue"],
|
||||||
},
|
},
|
||||||
TypographyMuted: {
|
"TypographyMuted": {
|
||||||
name: 'TypographyMuted',
|
name: "TypographyMuted",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/new-york/example/TypographyMuted.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/new-york/example/TypographyMuted.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/TypographyMuted.vue'],
|
files: ["../src/lib/registry/new-york/example/TypographyMuted.vue"],
|
||||||
},
|
},
|
||||||
TypographyP: {
|
"TypographyP": {
|
||||||
name: 'TypographyP',
|
name: "TypographyP",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/new-york/example/TypographyP.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/new-york/example/TypographyP.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/TypographyP.vue'],
|
files: ["../src/lib/registry/new-york/example/TypographyP.vue"],
|
||||||
},
|
},
|
||||||
TypographySmall: {
|
"TypographySmall": {
|
||||||
name: 'TypographySmall',
|
name: "TypographySmall",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/new-york/example/TypographySmall.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/new-york/example/TypographySmall.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/TypographySmall.vue'],
|
files: ["../src/lib/registry/new-york/example/TypographySmall.vue"],
|
||||||
},
|
},
|
||||||
TypographyTable: {
|
"TypographyTable": {
|
||||||
name: 'TypographyTable',
|
name: "TypographyTable",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: [],
|
registryDependencies: [],
|
||||||
component: () => import('../src/lib/registry/new-york/example/TypographyTable.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/new-york/example/TypographyTable.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/TypographyTable.vue'],
|
files: ["../src/lib/registry/new-york/example/TypographyTable.vue"],
|
||||||
},
|
},
|
||||||
ActivityGoal: {
|
"ActivityGoal": {
|
||||||
name: 'ActivityGoal',
|
name: "ActivityGoal",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: ['button', 'card', 'themes', 'config'],
|
registryDependencies: ["button","card","themes","config"],
|
||||||
component: () => import('../src/lib/registry/new-york/example/Cards/ActivityGoal.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/new-york/example/Cards/ActivityGoal.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/Cards/ActivityGoal.vue'],
|
files: ["../src/lib/registry/new-york/example/Cards/ActivityGoal.vue"],
|
||||||
},
|
},
|
||||||
DataTable: {
|
"DataTable": {
|
||||||
name: 'DataTable',
|
name: "DataTable",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: ['button', 'checkbox', 'dropdown-menu', 'input', 'table', 'card', 'utils'],
|
registryDependencies: ["button","checkbox","dropdown-menu","input","table","card","utils"],
|
||||||
component: () => import('../src/lib/registry/new-york/example/Cards/DataTable.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/new-york/example/Cards/DataTable.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/Cards/DataTable.vue'],
|
files: ["../src/lib/registry/new-york/example/Cards/DataTable.vue"],
|
||||||
},
|
},
|
||||||
Metric: {
|
"Metric": {
|
||||||
name: 'Metric',
|
name: "Metric",
|
||||||
type: 'components:example',
|
type: "components:example",
|
||||||
registryDependencies: ['card', 'config'],
|
registryDependencies: ["card","config"],
|
||||||
component: () => import('../src/lib/registry/new-york/example/Cards/Metric.vue').then(m => m.default),
|
component: () => import("../src/lib/registry/new-york/example/Cards/Metric.vue").then((m) => m.default),
|
||||||
files: ['../src/lib/registry/new-york/example/Cards/Metric.vue'],
|
files: ["../src/lib/registry/new-york/example/Cards/Metric.vue"],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@
|
||||||
"embla-carousel-autoplay": "^8.0.0-rc22",
|
"embla-carousel-autoplay": "^8.0.0-rc22",
|
||||||
"embla-carousel-vue": "^8.0.0-rc22",
|
"embla-carousel-vue": "^8.0.0-rc22",
|
||||||
"lucide-vue-next": "^0.276.0",
|
"lucide-vue-next": "^0.276.0",
|
||||||
"radix-vue": "^1.4.3",
|
"radix-vue": "^1.4.6",
|
||||||
"tailwindcss-animate": "^1.0.7",
|
"tailwindcss-animate": "^1.0.7",
|
||||||
"v-calendar": "^3.1.2",
|
"v-calendar": "^3.1.2",
|
||||||
"vee-validate": "4.12.5",
|
"vee-validate": "4.12.5",
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,10 @@ import { Input } from '@/components/ui/input'
|
||||||
|
|
||||||
<ComponentPreview name="InputWithButton" class="max-w-xs" />
|
<ComponentPreview name="InputWithButton" class="max-w-xs" />
|
||||||
|
|
||||||
|
### With Icon
|
||||||
|
|
||||||
|
<ComponentPreview name="InputWithIcon" class="max-w-xs" />
|
||||||
|
|
||||||
### Form
|
### Form
|
||||||
|
|
||||||
<ComponentPreview name="InputForm" />
|
<ComponentPreview name="InputForm" />
|
||||||
|
|
|
||||||
21
apps/www/src/content/docs/components/tags-input.md
Normal file
21
apps/www/src/content/docs/components/tags-input.md
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
title: Tags Input
|
||||||
|
description: Tag inputs render tags inside an input, followed by an actual text input.
|
||||||
|
source: apps/www/src/lib/registry/default/ui/tags-input
|
||||||
|
primitive: https://www.radix-vue.com/components/tags-input.html
|
||||||
|
---
|
||||||
|
|
||||||
|
<ComponentPreview name="TagsInputDemo" />
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npx shadcn-vue@latest add tags-input
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Tags with Combobox
|
||||||
|
|
||||||
|
<ComponentPreview name="TagsInputComboboxDemo" />
|
||||||
|
|
@ -84,7 +84,8 @@ const selectedValues = computed(() => new Set(props.column?.getFilterValue() as
|
||||||
v-for="option in options"
|
v-for="option in options"
|
||||||
:key="option.value"
|
:key="option.value"
|
||||||
:value="option"
|
:value="option"
|
||||||
@select="() => {
|
@select="(e) => {
|
||||||
|
console.log(e.detail.value)
|
||||||
const isSelected = selectedValues.has(option.value)
|
const isSelected = selectedValues.has(option.value)
|
||||||
if (isSelected) {
|
if (isSelected) {
|
||||||
selectedValues.delete(option.value)
|
selectedValues.delete(option.value)
|
||||||
|
|
|
||||||
13
apps/www/src/lib/registry/default/example/InputWithIcon.vue
Normal file
13
apps/www/src/lib/registry/default/example/InputWithIcon.vue
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MagnifyingGlassIcon } from '@radix-icons/vue'
|
||||||
|
import { Input } from '@/lib/registry/default/ui/input'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="relative w-full max-w-sm items-center">
|
||||||
|
<Input id="search" type="text" placeholder="Search..." class="pl-10" />
|
||||||
|
<span class="absolute start-0 inset-y-0 flex items-center justify-center px-2">
|
||||||
|
<MagnifyingGlassIcon class="size-6 text-muted-foreground" />
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { computed, ref } from 'vue'
|
||||||
|
import { ComboboxAnchor, ComboboxInput, ComboboxPortal, ComboboxRoot } from 'radix-vue'
|
||||||
|
import { CommandEmpty, CommandGroup, CommandItem, CommandList } from '@/lib/registry/default/ui/command'
|
||||||
|
import { TagsInput, TagsInputInput, TagsInputItem, TagsInputItemDelete, TagsInputItemText } from '@/lib/registry/default/ui/tags-input'
|
||||||
|
|
||||||
|
const frameworks = [
|
||||||
|
{ value: 'next.js', label: 'Next.js' },
|
||||||
|
{ value: 'sveltekit', label: 'SvelteKit' },
|
||||||
|
{ value: 'nuxt.js', label: 'Nuxt.js' },
|
||||||
|
{ value: 'remix', label: 'Remix' },
|
||||||
|
{ value: 'astro', label: 'Astro' },
|
||||||
|
]
|
||||||
|
|
||||||
|
const modelValue = ref<string[]>([])
|
||||||
|
const open = ref(false)
|
||||||
|
const searchTerm = ref('')
|
||||||
|
|
||||||
|
const filteredFrameworks = computed(() => frameworks.filter(i => !modelValue.value.includes(i.label)))
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<TagsInput class="px-0 gap-0 w-80" :model-value="modelValue">
|
||||||
|
<div class="flex gap-2 flex-wrap items-center px-3">
|
||||||
|
<TagsInputItem v-for="item in modelValue" :key="item" :value="item">
|
||||||
|
<TagsInputItemText />
|
||||||
|
<TagsInputItemDelete />
|
||||||
|
</TagsInputItem>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ComboboxRoot v-model="modelValue" v-model:open="open" v-model:searchTerm="searchTerm" class="w-full">
|
||||||
|
<ComboboxAnchor as-child>
|
||||||
|
<ComboboxInput placeholder="Framework..." as-child>
|
||||||
|
<TagsInputInput class="w-full px-3" :class="modelValue.length > 0 ? 'mt-2' : ''" @keydown.enter.prevent />
|
||||||
|
</ComboboxInput>
|
||||||
|
</ComboboxAnchor>
|
||||||
|
|
||||||
|
<ComboboxPortal>
|
||||||
|
<CommandList
|
||||||
|
position="popper"
|
||||||
|
class="w-[--radix-popper-anchor-width] rounded-md mt-2 border bg-popover text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2"
|
||||||
|
>
|
||||||
|
<CommandEmpty />
|
||||||
|
<CommandGroup>
|
||||||
|
<CommandItem
|
||||||
|
v-for="framework in filteredFrameworks" :key="framework.value" :value="framework.label"
|
||||||
|
@select.prevent="(ev) => {
|
||||||
|
if (typeof ev.detail.value === 'string') {
|
||||||
|
searchTerm = ''
|
||||||
|
modelValue.push(ev.detail.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filteredFrameworks.length === 0) {
|
||||||
|
open = false
|
||||||
|
}
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
{{ framework.label }}
|
||||||
|
</CommandItem>
|
||||||
|
</CommandGroup>
|
||||||
|
</CommandList>
|
||||||
|
</ComboboxPortal>
|
||||||
|
</ComboboxRoot>
|
||||||
|
</TagsInput>
|
||||||
|
</template>
|
||||||
17
apps/www/src/lib/registry/default/example/TagsInputDemo.vue
Normal file
17
apps/www/src/lib/registry/default/example/TagsInputDemo.vue
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref } from 'vue'
|
||||||
|
import { TagsInput, TagsInputInput, TagsInputItem, TagsInputItemDelete, TagsInputItemText } from '@/lib/registry/default/ui/tags-input'
|
||||||
|
|
||||||
|
const modelValue = ref(['Apple', 'Banana'])
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<TagsInput v-model="modelValue">
|
||||||
|
<TagsInputItem v-for="item in modelValue" :key="item" :value="item">
|
||||||
|
<TagsInputItemText />
|
||||||
|
<TagsInputItemDelete />
|
||||||
|
</TagsInputItem>
|
||||||
|
|
||||||
|
<TagsInputInput placeholder="Fruits..." />
|
||||||
|
</TagsInput>
|
||||||
|
</template>
|
||||||
|
|
@ -147,16 +147,10 @@ const vCalendarSlots = computed(() => {
|
||||||
@apply mt-4;
|
@apply mt-4;
|
||||||
}
|
}
|
||||||
.calendar .vc-weekdays {
|
.calendar .vc-weekdays {
|
||||||
@apply flex;
|
@apply justify-items-center;
|
||||||
}
|
}
|
||||||
.calendar .vc-weekday {
|
.calendar .vc-weekday {
|
||||||
@apply text-muted-foreground rounded-md w-full font-normal text-[0.8rem];
|
@apply text-muted-foreground rounded-md font-normal text-[0.8rem];
|
||||||
}
|
|
||||||
.calendar .vc-weekday-1 {
|
|
||||||
@apply pr-3;
|
|
||||||
}
|
|
||||||
.calendar .vc-weekday-7 {
|
|
||||||
@apply pl-3;
|
|
||||||
}
|
}
|
||||||
.calendar .vc-weeks {
|
.calendar .vc-weeks {
|
||||||
@apply w-full space-y-2 flex flex-col [&>_div]:grid [&>_div]:grid-cols-7;
|
@apply w-full space-y-2 flex flex-col [&>_div]:grid [&>_div]:grid-cols-7;
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ const forwardedProps = useForwardProps(delegatedProps)
|
||||||
)
|
)
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<span class="absolute right-2 flex h-3.5 w-3.5 items-center justify-center">
|
<span class="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
|
||||||
<SelectItemIndicator>
|
<SelectItemIndicator>
|
||||||
<Check class="h-4 w-4" />
|
<Check class="h-4 w-4" />
|
||||||
</SelectItemIndicator>
|
</SelectItemIndicator>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { type HTMLAttributes, computed } from 'vue'
|
||||||
|
import { TagsInputRoot, type TagsInputRootEmits, type TagsInputRootProps, useForwardPropsEmits } from 'radix-vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<TagsInputRootProps & { class?: HTMLAttributes['class'] }>()
|
||||||
|
const emits = defineEmits<TagsInputRootEmits>()
|
||||||
|
|
||||||
|
const delegatedProps = computed(() => {
|
||||||
|
const { class: _, ...delegated } = props
|
||||||
|
|
||||||
|
return delegated
|
||||||
|
})
|
||||||
|
|
||||||
|
const forwarded = useForwardPropsEmits(delegatedProps, emits)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<TagsInputRoot v-bind="forwarded" :class="cn('flex flex-wrap gap-2 items-center rounded-md border border-input bg-background px-3 py-2 text-sm', props.class)">
|
||||||
|
<slot />
|
||||||
|
</TagsInputRoot>
|
||||||
|
</template>
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { type HTMLAttributes, computed } from 'vue'
|
||||||
|
import { TagsInputInput, type TagsInputInputProps, useForwardProps } from 'radix-vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<TagsInputInputProps & { class?: HTMLAttributes['class'] }>()
|
||||||
|
|
||||||
|
const delegatedProps = computed(() => {
|
||||||
|
const { class: _, ...delegated } = props
|
||||||
|
|
||||||
|
return delegated
|
||||||
|
})
|
||||||
|
|
||||||
|
const forwardedProps = useForwardProps(delegatedProps)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<TagsInputInput v-bind="forwardedProps" :class="cn('text-sm min-h-6 focus:outline-none flex-1 bg-transparent px-1', props.class)" />
|
||||||
|
</template>
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { type HTMLAttributes, computed } from 'vue'
|
||||||
|
import { TagsInputItem, type TagsInputItemProps, useForwardProps } from 'radix-vue'
|
||||||
|
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<TagsInputItemProps & { class?: HTMLAttributes['class'] }>()
|
||||||
|
|
||||||
|
const delegatedProps = computed(() => {
|
||||||
|
const { class: _, ...delegated } = props
|
||||||
|
|
||||||
|
return delegated
|
||||||
|
})
|
||||||
|
|
||||||
|
const forwardedProps = useForwardProps(delegatedProps)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<TagsInputItem v-bind="forwardedProps" :class="cn('flex h-6 items-center rounded bg-secondary data-[state=active]:ring-ring data-[state=active]:ring-2 data-[state=active]:ring-offset-2 ring-offset-background', props.class)">
|
||||||
|
<slot />
|
||||||
|
</TagsInputItem>
|
||||||
|
</template>
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { type HTMLAttributes, computed } from 'vue'
|
||||||
|
import { TagsInputItemDelete, type TagsInputItemDeleteProps, useForwardProps } from 'radix-vue'
|
||||||
|
import { X } from 'lucide-vue-next'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<TagsInputItemDeleteProps & { class?: HTMLAttributes['class'] }>()
|
||||||
|
|
||||||
|
const delegatedProps = computed(() => {
|
||||||
|
const { class: _, ...delegated } = props
|
||||||
|
|
||||||
|
return delegated
|
||||||
|
})
|
||||||
|
|
||||||
|
const forwardedProps = useForwardProps(delegatedProps)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<TagsInputItemDelete v-bind="forwardedProps" :class="cn('flex rounded bg-transparent mr-1', props.class)">
|
||||||
|
<slot>
|
||||||
|
<X class="w-4 h-4" />
|
||||||
|
</slot>
|
||||||
|
</TagsInputItemDelete>
|
||||||
|
</template>
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { type HTMLAttributes, computed } from 'vue'
|
||||||
|
import { TagsInputItemText, type TagsInputItemTextProps, useForwardProps } from 'radix-vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<TagsInputItemTextProps & { class?: HTMLAttributes['class'] }>()
|
||||||
|
|
||||||
|
const delegatedProps = computed(() => {
|
||||||
|
const { class: _, ...delegated } = props
|
||||||
|
|
||||||
|
return delegated
|
||||||
|
})
|
||||||
|
|
||||||
|
const forwardedProps = useForwardProps(delegatedProps)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<TagsInputItemText v-bind="forwardedProps" :class="cn('py-1 px-2 text-sm rounded bg-transparent', props.class)" />
|
||||||
|
</template>
|
||||||
5
apps/www/src/lib/registry/default/ui/tags-input/index.ts
Normal file
5
apps/www/src/lib/registry/default/ui/tags-input/index.ts
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
export { default as TagsInput } from './TagsInput.vue'
|
||||||
|
export { default as TagsInputInput } from './TagsInputInput.vue'
|
||||||
|
export { default as TagsInputItem } from './TagsInputItem.vue'
|
||||||
|
export { default as TagsInputItemDelete } from './TagsInputItemDelete.vue'
|
||||||
|
export { default as TagsInputItemText } from './TagsInputItemText.vue'
|
||||||
13
apps/www/src/lib/registry/new-york/example/InputWithIcon.vue
Normal file
13
apps/www/src/lib/registry/new-york/example/InputWithIcon.vue
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MagnifyingGlassIcon } from '@radix-icons/vue'
|
||||||
|
import { Input } from '@/lib/registry/new-york/ui/input'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="relative w-full max-w-sm items-center">
|
||||||
|
<Input id="search" type="text" placeholder="Search..." class="pl-10" />
|
||||||
|
<span class="absolute start-0 inset-y-0 flex items-center justify-center px-2">
|
||||||
|
<MagnifyingGlassIcon class="size-6 text-muted-foreground" />
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { computed, ref } from 'vue'
|
||||||
|
import { ComboboxAnchor, ComboboxInput, ComboboxPortal, ComboboxRoot } from 'radix-vue'
|
||||||
|
import { CommandEmpty, CommandGroup, CommandItem, CommandList } from '@/lib/registry/new-york/ui/command'
|
||||||
|
import { TagsInput, TagsInputInput, TagsInputItem, TagsInputItemDelete, TagsInputItemText } from '@/lib/registry/new-york/ui/tags-input'
|
||||||
|
|
||||||
|
const frameworks = [
|
||||||
|
{ value: 'next.js', label: 'Next.js' },
|
||||||
|
{ value: 'sveltekit', label: 'SvelteKit' },
|
||||||
|
{ value: 'nuxt.js', label: 'Nuxt.js' },
|
||||||
|
{ value: 'remix', label: 'Remix' },
|
||||||
|
{ value: 'astro', label: 'Astro' },
|
||||||
|
]
|
||||||
|
|
||||||
|
const modelValue = ref<string[]>([])
|
||||||
|
const open = ref(false)
|
||||||
|
const searchTerm = ref('')
|
||||||
|
|
||||||
|
const filteredFrameworks = computed(() => frameworks.filter(i => !modelValue.value.includes(i.label)))
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<TagsInput class="px-0 gap-0 w-80" :model-value="modelValue">
|
||||||
|
<div class="flex gap-2 flex-wrap items-center px-3">
|
||||||
|
<TagsInputItem v-for="item in modelValue" :key="item" :value="item">
|
||||||
|
<TagsInputItemText />
|
||||||
|
<TagsInputItemDelete />
|
||||||
|
</TagsInputItem>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ComboboxRoot v-model="modelValue" v-model:open="open" v-model:searchTerm="searchTerm" class="w-full">
|
||||||
|
<ComboboxAnchor as-child>
|
||||||
|
<ComboboxInput placeholder="Framework..." as-child>
|
||||||
|
<TagsInputInput class="w-full px-3" :class="modelValue.length > 0 ? 'mt-2' : ''" @keydown.enter.prevent />
|
||||||
|
</ComboboxInput>
|
||||||
|
</ComboboxAnchor>
|
||||||
|
|
||||||
|
<ComboboxPortal>
|
||||||
|
<CommandList
|
||||||
|
position="popper"
|
||||||
|
class="w-[--radix-popper-anchor-width] rounded-md mt-2 border bg-popover text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2"
|
||||||
|
>
|
||||||
|
<CommandEmpty />
|
||||||
|
<CommandGroup>
|
||||||
|
<CommandItem
|
||||||
|
v-for="framework in filteredFrameworks" :key="framework.value" :value="framework.label"
|
||||||
|
@select.prevent="(ev) => {
|
||||||
|
if (typeof ev.detail.value === 'string') {
|
||||||
|
searchTerm = ''
|
||||||
|
modelValue.push(ev.detail.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filteredFrameworks.length === 0) {
|
||||||
|
open = false
|
||||||
|
}
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
{{ framework.label }}
|
||||||
|
</CommandItem>
|
||||||
|
</CommandGroup>
|
||||||
|
</CommandList>
|
||||||
|
</ComboboxPortal>
|
||||||
|
</ComboboxRoot>
|
||||||
|
</TagsInput>
|
||||||
|
</template>
|
||||||
17
apps/www/src/lib/registry/new-york/example/TagsInputDemo.vue
Normal file
17
apps/www/src/lib/registry/new-york/example/TagsInputDemo.vue
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref } from 'vue'
|
||||||
|
import { TagsInput, TagsInputInput, TagsInputItem, TagsInputItemDelete, TagsInputItemText } from '@/lib/registry/new-york/ui/tags-input'
|
||||||
|
|
||||||
|
const modelValue = ref(['Apple', 'Banana'])
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<TagsInput v-model="modelValue">
|
||||||
|
<TagsInputItem v-for="item in modelValue" :key="item" :value="item">
|
||||||
|
<TagsInputItemText />
|
||||||
|
<TagsInputItemDelete />
|
||||||
|
</TagsInputItem>
|
||||||
|
|
||||||
|
<TagsInputInput placeholder="Fruits..." />
|
||||||
|
</TagsInput>
|
||||||
|
</template>
|
||||||
|
|
@ -148,16 +148,10 @@ const vCalendarSlots = computed(() => {
|
||||||
@apply mt-4;
|
@apply mt-4;
|
||||||
}
|
}
|
||||||
.calendar .vc-weekdays {
|
.calendar .vc-weekdays {
|
||||||
@apply flex;
|
@apply justify-items-center;
|
||||||
}
|
}
|
||||||
.calendar .vc-weekday {
|
.calendar .vc-weekday {
|
||||||
@apply text-muted-foreground rounded-md w-full font-normal text-[0.8rem];
|
@apply text-muted-foreground rounded-md font-normal text-[0.8rem];
|
||||||
}
|
|
||||||
.calendar .vc-weekday-1 {
|
|
||||||
@apply pr-3;
|
|
||||||
}
|
|
||||||
.calendar .vc-weekday-7 {
|
|
||||||
@apply pl-3;
|
|
||||||
}
|
}
|
||||||
.calendar .vc-weeks {
|
.calendar .vc-weeks {
|
||||||
@apply w-full space-y-2 flex flex-col [&>_div]:grid [&>_div]:grid-cols-7;
|
@apply w-full space-y-2 flex flex-col [&>_div]:grid [&>_div]:grid-cols-7;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { type HTMLAttributes, computed } from 'vue'
|
||||||
|
import { TagsInputRoot, type TagsInputRootEmits, type TagsInputRootProps, useForwardPropsEmits } from 'radix-vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<TagsInputRootProps & { class?: HTMLAttributes['class'] }>()
|
||||||
|
const emits = defineEmits<TagsInputRootEmits>()
|
||||||
|
|
||||||
|
const delegatedProps = computed(() => {
|
||||||
|
const { class: _, ...delegated } = props
|
||||||
|
|
||||||
|
return delegated
|
||||||
|
})
|
||||||
|
|
||||||
|
const forwarded = useForwardPropsEmits(delegatedProps, emits)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<TagsInputRoot v-bind="forwarded" :class="cn('flex flex-wrap gap-2 items-center rounded-md border border-input bg-background px-3 py-1.5 text-sm', props.class)">
|
||||||
|
<slot />
|
||||||
|
</TagsInputRoot>
|
||||||
|
</template>
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { type HTMLAttributes, computed } from 'vue'
|
||||||
|
import { TagsInputInput, type TagsInputInputProps, useForwardProps } from 'radix-vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<TagsInputInputProps & { class?: HTMLAttributes['class'] }>()
|
||||||
|
|
||||||
|
const delegatedProps = computed(() => {
|
||||||
|
const { class: _, ...delegated } = props
|
||||||
|
|
||||||
|
return delegated
|
||||||
|
})
|
||||||
|
|
||||||
|
const forwardedProps = useForwardProps(delegatedProps)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<TagsInputInput v-bind="forwardedProps" :class="cn('text-sm min-h-5 focus:outline-none flex-1 bg-transparent px-1', props.class)" />
|
||||||
|
</template>
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { type HTMLAttributes, computed } from 'vue'
|
||||||
|
import { TagsInputItem, type TagsInputItemProps, useForwardProps } from 'radix-vue'
|
||||||
|
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<TagsInputItemProps & { class?: HTMLAttributes['class'] }>()
|
||||||
|
|
||||||
|
const delegatedProps = computed(() => {
|
||||||
|
const { class: _, ...delegated } = props
|
||||||
|
|
||||||
|
return delegated
|
||||||
|
})
|
||||||
|
|
||||||
|
const forwardedProps = useForwardProps(delegatedProps)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<TagsInputItem v-bind="forwardedProps" :class="cn('flex h-5 items-center rounded-md bg-secondary data-[state=active]:ring-ring data-[state=active]:ring-2 data-[state=active]:ring-offset-2 ring-offset-background', props.class)">
|
||||||
|
<slot />
|
||||||
|
</TagsInputItem>
|
||||||
|
</template>
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { type HTMLAttributes, computed } from 'vue'
|
||||||
|
import { TagsInputItemDelete, type TagsInputItemDeleteProps, useForwardProps } from 'radix-vue'
|
||||||
|
import { Cross2Icon } from '@radix-icons/vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<TagsInputItemDeleteProps & { class?: HTMLAttributes['class'] }>()
|
||||||
|
|
||||||
|
const delegatedProps = computed(() => {
|
||||||
|
const { class: _, ...delegated } = props
|
||||||
|
|
||||||
|
return delegated
|
||||||
|
})
|
||||||
|
|
||||||
|
const forwardedProps = useForwardProps(delegatedProps)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<TagsInputItemDelete v-bind="forwardedProps" :class="cn('flex rounded bg-transparent mr-1', props.class)">
|
||||||
|
<slot>
|
||||||
|
<Cross2Icon class="w-4 h-4" />
|
||||||
|
</slot>
|
||||||
|
</TagsInputItemDelete>
|
||||||
|
</template>
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { type HTMLAttributes, computed } from 'vue'
|
||||||
|
import { TagsInputItemText, type TagsInputItemTextProps, useForwardProps } from 'radix-vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<TagsInputItemTextProps & { class?: HTMLAttributes['class'] }>()
|
||||||
|
|
||||||
|
const delegatedProps = computed(() => {
|
||||||
|
const { class: _, ...delegated } = props
|
||||||
|
|
||||||
|
return delegated
|
||||||
|
})
|
||||||
|
|
||||||
|
const forwardedProps = useForwardProps(delegatedProps)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<TagsInputItemText v-bind="forwardedProps" :class="cn('py-0.5 px-2 text-sm rounded bg-transparent', props.class)" />
|
||||||
|
</template>
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
export { default as TagsInput } from './TagsInput.vue'
|
||||||
|
export { default as TagsInputInput } from './TagsInputInput.vue'
|
||||||
|
export { default as TagsInputItem } from './TagsInputItem.vue'
|
||||||
|
export { default as TagsInputItemDelete } from './TagsInputItemDelete.vue'
|
||||||
|
export { default as TagsInputItemText } from './TagsInputItemText.vue'
|
||||||
BIN
apps/www/src/public/fonts/Geist/GeistVariableVF.woff2
Normal file
BIN
apps/www/src/public/fonts/Geist/GeistVariableVF.woff2
Normal file
Binary file not shown.
92
apps/www/src/public/fonts/Geist/LICENSE.TXT
Normal file
92
apps/www/src/public/fonts/Geist/LICENSE.TXT
Normal file
|
|
@ -0,0 +1,92 @@
|
||||||
|
Geist Sans and Geist Mono Font
|
||||||
|
(C) 2023 Vercel, made in collaboration with basement.studio
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
This license is available with a FAQ at: http://scripts.sil.org/OFL and copied below
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION AND CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
|
|
@ -594,6 +594,22 @@
|
||||||
],
|
],
|
||||||
"type": "components:ui"
|
"type": "components:ui"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "tags-input",
|
||||||
|
"dependencies": [],
|
||||||
|
"registryDependencies": [
|
||||||
|
"utils"
|
||||||
|
],
|
||||||
|
"files": [
|
||||||
|
"ui/tags-input/TagsInput.vue",
|
||||||
|
"ui/tags-input/TagsInputInput.vue",
|
||||||
|
"ui/tags-input/TagsInputItem.vue",
|
||||||
|
"ui/tags-input/TagsInputItemDelete.vue",
|
||||||
|
"ui/tags-input/TagsInputItemText.vue",
|
||||||
|
"ui/tags-input/index.ts"
|
||||||
|
],
|
||||||
|
"type": "components:ui"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "textarea",
|
"name": "textarea",
|
||||||
"dependencies": [
|
"dependencies": [
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -19,7 +19,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "SelectItem.vue",
|
"name": "SelectItem.vue",
|
||||||
"content": "<script setup lang=\"ts\">\nimport { type HTMLAttributes, computed } from 'vue'\nimport {\n SelectItem,\n SelectItemIndicator,\n type SelectItemProps,\n SelectItemText,\n useForwardProps,\n} from 'radix-vue'\nimport { Check } from 'lucide-vue-next'\nimport { cn } from '@/lib/utils'\n\nconst props = defineProps<SelectItemProps & { class?: HTMLAttributes['class'] }>()\n\nconst delegatedProps = computed(() => {\n const { class: _, ...delegated } = props\n\n return delegated\n})\n\nconst forwardedProps = useForwardProps(delegatedProps)\n</script>\n\n<template>\n <SelectItem\n v-bind=\"forwardedProps\"\n :class=\"\n cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n props.class,\n )\n \"\n >\n <span class=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectItemIndicator>\n <Check class=\"h-4 w-4\" />\n </SelectItemIndicator>\n </span>\n\n <SelectItemText>\n <slot />\n </SelectItemText>\n </SelectItem>\n</template>\n"
|
"content": "<script setup lang=\"ts\">\nimport { type HTMLAttributes, computed } from 'vue'\nimport {\n SelectItem,\n SelectItemIndicator,\n type SelectItemProps,\n SelectItemText,\n useForwardProps,\n} from 'radix-vue'\nimport { Check } from 'lucide-vue-next'\nimport { cn } from '@/lib/utils'\n\nconst props = defineProps<SelectItemProps & { class?: HTMLAttributes['class'] }>()\n\nconst delegatedProps = computed(() => {\n const { class: _, ...delegated } = props\n\n return delegated\n})\n\nconst forwardedProps = useForwardProps(delegatedProps)\n</script>\n\n<template>\n <SelectItem\n v-bind=\"forwardedProps\"\n :class=\"\n cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n props.class,\n )\n \"\n >\n <span class=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectItemIndicator>\n <Check class=\"h-4 w-4\" />\n </SelectItemIndicator>\n </span>\n\n <SelectItemText>\n <slot />\n </SelectItemText>\n </SelectItem>\n</template>\n"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "SelectItemText.vue",
|
"name": "SelectItemText.vue",
|
||||||
|
|
|
||||||
34
apps/www/src/public/registry/styles/default/tags-input.json
Normal file
34
apps/www/src/public/registry/styles/default/tags-input.json
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
{
|
||||||
|
"name": "tags-input",
|
||||||
|
"dependencies": [],
|
||||||
|
"registryDependencies": [
|
||||||
|
"utils"
|
||||||
|
],
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"name": "TagsInput.vue",
|
||||||
|
"content": "<script setup lang=\"ts\">\nimport { type HTMLAttributes, computed } from 'vue'\nimport { TagsInputRoot, type TagsInputRootEmits, type TagsInputRootProps, useForwardPropsEmits } from 'radix-vue'\nimport { cn } from '@/lib/utils'\n\nconst props = defineProps<TagsInputRootProps & { class?: HTMLAttributes['class'] }>()\nconst emits = defineEmits<TagsInputRootEmits>()\n\nconst delegatedProps = computed(() => {\n const { class: _, ...delegated } = props\n\n return delegated\n})\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits)\n</script>\n\n<template>\n <TagsInputRoot v-bind=\"forwarded\" :class=\"cn('flex flex-wrap gap-2 items-center rounded-md border border-input bg-background px-3 py-2 text-sm', props.class)\">\n <slot />\n </TagsInputRoot>\n</template>\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "TagsInputInput.vue",
|
||||||
|
"content": "<script setup lang=\"ts\">\nimport { type HTMLAttributes, computed } from 'vue'\nimport { TagsInputInput, type TagsInputInputProps, useForwardProps } from 'radix-vue'\nimport { cn } from '@/lib/utils'\n\nconst props = defineProps<TagsInputInputProps & { class?: HTMLAttributes['class'] }>()\n\nconst delegatedProps = computed(() => {\n const { class: _, ...delegated } = props\n\n return delegated\n})\n\nconst forwardedProps = useForwardProps(delegatedProps)\n</script>\n\n<template>\n <TagsInputInput v-bind=\"forwardedProps\" :class=\"cn('text-sm min-h-6 focus:outline-none flex-1 bg-transparent px-1', props.class)\" />\n</template>\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "TagsInputItem.vue",
|
||||||
|
"content": "<script setup lang=\"ts\">\nimport { type HTMLAttributes, computed } from 'vue'\nimport { TagsInputItem, type TagsInputItemProps, useForwardProps } from 'radix-vue'\n\nimport { cn } from '@/lib/utils'\n\nconst props = defineProps<TagsInputItemProps & { class?: HTMLAttributes['class'] }>()\n\nconst delegatedProps = computed(() => {\n const { class: _, ...delegated } = props\n\n return delegated\n})\n\nconst forwardedProps = useForwardProps(delegatedProps)\n</script>\n\n<template>\n <TagsInputItem v-bind=\"forwardedProps\" :class=\"cn('flex h-6 items-center rounded bg-secondary data-[state=active]:ring-ring data-[state=active]:ring-2 data-[state=active]:ring-offset-2 ring-offset-background', props.class)\">\n <slot />\n </TagsInputItem>\n</template>\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "TagsInputItemDelete.vue",
|
||||||
|
"content": "<script setup lang=\"ts\">\nimport { type HTMLAttributes, computed } from 'vue'\nimport { TagsInputItemDelete, type TagsInputItemDeleteProps, useForwardProps } from 'radix-vue'\nimport { X } from 'lucide-vue-next'\nimport { cn } from '@/lib/utils'\n\nconst props = defineProps<TagsInputItemDeleteProps & { class?: HTMLAttributes['class'] }>()\n\nconst delegatedProps = computed(() => {\n const { class: _, ...delegated } = props\n\n return delegated\n})\n\nconst forwardedProps = useForwardProps(delegatedProps)\n</script>\n\n<template>\n <TagsInputItemDelete v-bind=\"forwardedProps\" :class=\"cn('flex rounded bg-transparent mr-1', props.class)\">\n <slot>\n <X class=\"w-4 h-4\" />\n </slot>\n </TagsInputItemDelete>\n</template>\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "TagsInputItemText.vue",
|
||||||
|
"content": "<script setup lang=\"ts\">\nimport { type HTMLAttributes, computed } from 'vue'\nimport { TagsInputItemText, type TagsInputItemTextProps, useForwardProps } from 'radix-vue'\nimport { cn } from '@/lib/utils'\n\nconst props = defineProps<TagsInputItemTextProps & { class?: HTMLAttributes['class'] }>()\n\nconst delegatedProps = computed(() => {\n const { class: _, ...delegated } = props\n\n return delegated\n})\n\nconst forwardedProps = useForwardProps(delegatedProps)\n</script>\n\n<template>\n <TagsInputItemText v-bind=\"forwardedProps\" :class=\"cn('py-1 px-2 text-sm rounded bg-transparent', props.class)\" />\n</template>\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "index.ts",
|
||||||
|
"content": "export { default as TagsInput } from './TagsInput.vue'\nexport { default as TagsInputInput } from './TagsInputInput.vue'\nexport { default as TagsInputItem } from './TagsInputItem.vue'\nexport { default as TagsInputItemDelete } from './TagsInputItemDelete.vue'\nexport { default as TagsInputItemText } from './TagsInputItemText.vue'\n"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"type": "components:ui"
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
34
apps/www/src/public/registry/styles/new-york/tags-input.json
Normal file
34
apps/www/src/public/registry/styles/new-york/tags-input.json
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
{
|
||||||
|
"name": "tags-input",
|
||||||
|
"dependencies": [],
|
||||||
|
"registryDependencies": [
|
||||||
|
"utils"
|
||||||
|
],
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"name": "TagsInput.vue",
|
||||||
|
"content": "<script setup lang=\"ts\">\nimport { type HTMLAttributes, computed } from 'vue'\nimport { TagsInputRoot, type TagsInputRootEmits, type TagsInputRootProps, useForwardPropsEmits } from 'radix-vue'\nimport { cn } from '@/lib/utils'\n\nconst props = defineProps<TagsInputRootProps & { class?: HTMLAttributes['class'] }>()\nconst emits = defineEmits<TagsInputRootEmits>()\n\nconst delegatedProps = computed(() => {\n const { class: _, ...delegated } = props\n\n return delegated\n})\n\nconst forwarded = useForwardPropsEmits(delegatedProps, emits)\n</script>\n\n<template>\n <TagsInputRoot v-bind=\"forwarded\" :class=\"cn('flex flex-wrap gap-2 items-center rounded-md border border-input bg-background px-3 py-1.5 text-sm', props.class)\">\n <slot />\n </TagsInputRoot>\n</template>\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "TagsInputInput.vue",
|
||||||
|
"content": "<script setup lang=\"ts\">\nimport { type HTMLAttributes, computed } from 'vue'\nimport { TagsInputInput, type TagsInputInputProps, useForwardProps } from 'radix-vue'\nimport { cn } from '@/lib/utils'\n\nconst props = defineProps<TagsInputInputProps & { class?: HTMLAttributes['class'] }>()\n\nconst delegatedProps = computed(() => {\n const { class: _, ...delegated } = props\n\n return delegated\n})\n\nconst forwardedProps = useForwardProps(delegatedProps)\n</script>\n\n<template>\n <TagsInputInput v-bind=\"forwardedProps\" :class=\"cn('text-sm min-h-5 focus:outline-none flex-1 bg-transparent px-1', props.class)\" />\n</template>\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "TagsInputItem.vue",
|
||||||
|
"content": "<script setup lang=\"ts\">\nimport { type HTMLAttributes, computed } from 'vue'\nimport { TagsInputItem, type TagsInputItemProps, useForwardProps } from 'radix-vue'\n\nimport { cn } from '@/lib/utils'\n\nconst props = defineProps<TagsInputItemProps & { class?: HTMLAttributes['class'] }>()\n\nconst delegatedProps = computed(() => {\n const { class: _, ...delegated } = props\n\n return delegated\n})\n\nconst forwardedProps = useForwardProps(delegatedProps)\n</script>\n\n<template>\n <TagsInputItem v-bind=\"forwardedProps\" :class=\"cn('flex h-5 items-center rounded-md bg-secondary data-[state=active]:ring-ring data-[state=active]:ring-2 data-[state=active]:ring-offset-2 ring-offset-background', props.class)\">\n <slot />\n </TagsInputItem>\n</template>\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "TagsInputItemDelete.vue",
|
||||||
|
"content": "<script setup lang=\"ts\">\nimport { type HTMLAttributes, computed } from 'vue'\nimport { TagsInputItemDelete, type TagsInputItemDeleteProps, useForwardProps } from 'radix-vue'\nimport { Cross2Icon } from '@radix-icons/vue'\nimport { cn } from '@/lib/utils'\n\nconst props = defineProps<TagsInputItemDeleteProps & { class?: HTMLAttributes['class'] }>()\n\nconst delegatedProps = computed(() => {\n const { class: _, ...delegated } = props\n\n return delegated\n})\n\nconst forwardedProps = useForwardProps(delegatedProps)\n</script>\n\n<template>\n <TagsInputItemDelete v-bind=\"forwardedProps\" :class=\"cn('flex rounded bg-transparent mr-1', props.class)\">\n <slot>\n <Cross2Icon class=\"w-4 h-4\" />\n </slot>\n </TagsInputItemDelete>\n</template>\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "TagsInputItemText.vue",
|
||||||
|
"content": "<script setup lang=\"ts\">\nimport { type HTMLAttributes, computed } from 'vue'\nimport { TagsInputItemText, type TagsInputItemTextProps, useForwardProps } from 'radix-vue'\nimport { cn } from '@/lib/utils'\n\nconst props = defineProps<TagsInputItemTextProps & { class?: HTMLAttributes['class'] }>()\n\nconst delegatedProps = computed(() => {\n const { class: _, ...delegated } = props\n\n return delegated\n})\n\nconst forwardedProps = useForwardProps(delegatedProps)\n</script>\n\n<template>\n <TagsInputItemText v-bind=\"forwardedProps\" :class=\"cn('py-0.5 px-2 text-sm rounded bg-transparent', props.class)\" />\n</template>\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "index.ts",
|
||||||
|
"content": "export { default as TagsInput } from './TagsInput.vue'\nexport { default as TagsInputInput } from './TagsInputInput.vue'\nexport { default as TagsInputItem } from './TagsInputItem.vue'\nexport { default as TagsInputItemDelete } from './TagsInputItemDelete.vue'\nexport { default as TagsInputItemText } from './TagsInputItemText.vue'\n"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"type": "components:ui"
|
||||||
|
}
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
import defaultTheme from 'tailwindcss/defaultTheme'
|
||||||
import tailwindcssAnimate from 'tailwindcss-animate'
|
import tailwindcssAnimate from 'tailwindcss-animate'
|
||||||
|
|
||||||
/** @type {import('tailwindcss').Config} */
|
/** @type {import('tailwindcss').Config} */
|
||||||
|
|
@ -13,6 +14,9 @@ export default {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
extend: {
|
extend: {
|
||||||
|
fontFamily: {
|
||||||
|
sans: ['var(--font-geist-sans)', ...defaultTheme.fontFamily.sans],
|
||||||
|
},
|
||||||
colors: {
|
colors: {
|
||||||
border: 'hsl(var(--border))',
|
border: 'hsl(var(--border))',
|
||||||
input: 'hsl(var(--input))',
|
input: 'hsl(var(--input))',
|
||||||
|
|
|
||||||
29
eslint.config.js
Normal file
29
eslint.config.js
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
import antfu from '@antfu/eslint-config'
|
||||||
|
|
||||||
|
export default antfu(
|
||||||
|
{
|
||||||
|
vue: true,
|
||||||
|
typescript: true,
|
||||||
|
ignores: [
|
||||||
|
'**/__registry__/index.ts',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
files: ['**/*.vue'],
|
||||||
|
rules: {
|
||||||
|
'vue/one-component-per-file': 0,
|
||||||
|
'vue/no-reserved-component-names': 0,
|
||||||
|
'vue/no-useless-v-bind': 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// Without `files`, they are general rules for all files
|
||||||
|
rules: {
|
||||||
|
'symbol-description': 0,
|
||||||
|
'no-console': 1,
|
||||||
|
'no-tabs': 0,
|
||||||
|
'import/first': 0,
|
||||||
|
'node/prefer-global/process': 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
)
|
||||||
20
package.json
20
package.json
|
|
@ -1,8 +1,9 @@
|
||||||
{
|
{
|
||||||
"name": "shadcn-vue",
|
"name": "shadcn-vue",
|
||||||
|
"type": "module",
|
||||||
"version": "0.9.0",
|
"version": "0.9.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"packageManager": "pnpm@8.15.1",
|
"packageManager": "pnpm@8.15.3",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": "radix-vue/shadcn-vue",
|
"repository": "radix-vue/shadcn-vue",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
|
|
@ -26,16 +27,15 @@
|
||||||
"taze:minor": "taze minor -fwri --ignore-paths ./packages/cli/test/** --exclude /@iconify/"
|
"taze:minor": "taze minor -fwri --ignore-paths ./packages/cli/test/** --exclude /@iconify/"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@antfu/eslint-config": "^0.43.1",
|
"@antfu/eslint-config": "^2.6.4",
|
||||||
"@commitlint/cli": "^17.7.1",
|
"@commitlint/cli": "^18.6.1",
|
||||||
"@commitlint/config-conventional": "^17.7.0",
|
"@commitlint/config-conventional": "^18.6.2",
|
||||||
"bumpp": "^9.2.0",
|
"bumpp": "^9.3.0",
|
||||||
"eslint": "^8.52.0",
|
"eslint": "^8.56.0",
|
||||||
"lint-staged": "^14.0.1",
|
"lint-staged": "^15.2.2",
|
||||||
"pnpm": "^8.10.2",
|
|
||||||
"simple-git-hooks": "^2.9.0",
|
"simple-git-hooks": "^2.9.0",
|
||||||
"taze": "^0.12.0",
|
"taze": "^0.13.3",
|
||||||
"typescript": "^5.2.2",
|
"typescript": "^5.3.3",
|
||||||
"vitest": "^0.34.6"
|
"vitest": "^0.34.6"
|
||||||
},
|
},
|
||||||
"commitlint": {
|
"commitlint": {
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@
|
||||||
"node-fetch": "^3.3.2",
|
"node-fetch": "^3.3.2",
|
||||||
"ora": "^7.0.1",
|
"ora": "^7.0.1",
|
||||||
"prompts": "^2.4.2",
|
"prompts": "^2.4.2",
|
||||||
"radix-vue": "^1.4.1",
|
"radix-vue": "^1.4.6",
|
||||||
"recast": "^0.23.4",
|
"recast": "^0.23.4",
|
||||||
"rimraf": "^5.0.1",
|
"rimraf": "^5.0.1",
|
||||||
"ts-morph": "^19.0.0",
|
"ts-morph": "^19.0.0",
|
||||||
|
|
|
||||||
2
packages/cli/test/fixtures/nuxt/package.json
vendored
2
packages/cli/test/fixtures/nuxt/package.json
vendored
|
|
@ -13,7 +13,7 @@
|
||||||
"class-variance-authority": "^0.7.0",
|
"class-variance-authority": "^0.7.0",
|
||||||
"clsx": "^2.0.0",
|
"clsx": "^2.0.0",
|
||||||
"lucide-vue-next": "^0.276.0",
|
"lucide-vue-next": "^0.276.0",
|
||||||
"radix-vue": "^1.4.1",
|
"radix-vue": "^1.4.6",
|
||||||
"tailwind-merge": "^1.14.0",
|
"tailwind-merge": "^1.14.0",
|
||||||
"tailwindcss-animate": "^1.0.7"
|
"tailwindcss-animate": "^1.0.7"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
"embla-carousel": "8.0.0-rc19",
|
"embla-carousel": "8.0.0-rc19",
|
||||||
"embla-carousel-vue": "8.0.0-rc19",
|
"embla-carousel-vue": "8.0.0-rc19",
|
||||||
"lucide-vue-next": "^0.276.0",
|
"lucide-vue-next": "^0.276.0",
|
||||||
"radix-vue": "^1.4.1",
|
"radix-vue": "^1.4.6",
|
||||||
"tailwind-merge": "^2.0.0",
|
"tailwind-merge": "^2.0.0",
|
||||||
"tailwindcss-animate": "^1.0.7"
|
"tailwindcss-animate": "^1.0.7"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
1095
pnpm-lock.yaml
1095
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user