From 062a0706ef63f320316f42d302eeb1ac54de7fa7 Mon Sep 17 00:00:00 2001 From: Jeton Korenica Date: Mon, 13 Jul 2026 18:08:43 +0200 Subject: [PATCH] feat: add Table, Stepper, and Navigation Menu components Three new COSS-styled component families with demos, views, routes and Home nav entries: - Table: plain HTML table primitives (Table/Header/Body/Footer/Row/Head/ Cell/Caption) with 2 demos (basic + badges/footer/caption) - Stepper: Reka UI Stepper primitives (Root/Item/Trigger/Indicator/Title/ Description/Separator) with 2 demos (indicator-only + controlled w/ buttons) - Navigation Menu: Reka UI NavigationMenu primitives with viewport, before- highlight surface and animated flyout; 2 demos (flyout + simple links) All use COSS tokens (rounded-lg, opacity-64, before-highlight surfaces). type-check, lint and build pass; verified visually in-browser. --- README.md | 3 + .../navigation-menus/NavigationMenu01.vue | 45 ++++++++++++++ .../navigation-menus/NavigationMenu02.vue | 23 ++++++++ src/components/steppers/Stepper01.vue | 33 +++++++++++ src/components/steppers/Stepper02.vue | 59 +++++++++++++++++++ src/components/tables/Table01.vue | 40 +++++++++++++ src/components/tables/Table02.vue | 50 ++++++++++++++++ .../ui/NavigationMenu/NavigationMenu.vue | 30 ++++++++++ .../NavigationMenu/NavigationMenuContent.vue | 31 ++++++++++ .../NavigationMenuIndicator.vue | 26 ++++++++ .../ui/NavigationMenu/NavigationMenuItem.vue | 16 +++++ .../ui/NavigationMenu/NavigationMenuLink.vue | 31 ++++++++++ .../ui/NavigationMenu/NavigationMenuList.vue | 19 ++++++ .../NavigationMenu/NavigationMenuTrigger.vue | 25 ++++++++ .../NavigationMenu/NavigationMenuViewport.vue | 24 ++++++++ src/components/ui/NavigationMenu/index.ts | 9 +++ src/components/ui/NavigationMenu/style.ts | 5 ++ src/components/ui/Stepper/Stepper.vue | 23 ++++++++ .../ui/Stepper/StepperDescription.vue | 19 ++++++ .../ui/Stepper/StepperIndicator.vue | 24 ++++++++ src/components/ui/Stepper/StepperItem.vue | 24 ++++++++ .../ui/Stepper/StepperSeparator.vue | 22 +++++++ src/components/ui/Stepper/StepperTitle.vue | 19 ++++++ src/components/ui/Stepper/StepperTrigger.vue | 24 ++++++++ src/components/ui/Stepper/index.ts | 7 +++ src/components/ui/Table/Table.vue | 14 +++++ src/components/ui/Table/TableBody.vue | 12 ++++ src/components/ui/Table/TableCaption.vue | 12 ++++ src/components/ui/Table/TableCell.vue | 14 +++++ src/components/ui/Table/TableFooter.vue | 14 +++++ src/components/ui/Table/TableHead.vue | 19 ++++++ src/components/ui/Table/TableHeader.vue | 12 ++++ src/components/ui/Table/TableRow.vue | 19 ++++++ src/components/ui/Table/index.ts | 8 +++ src/router/index.ts | 18 ++++++ src/views/Home.vue | 5 +- src/views/NavigationMenus.vue | 39 ++++++++++++ src/views/Steppers.vue | 39 ++++++++++++ src/views/Tables.vue | 39 ++++++++++++ 39 files changed, 894 insertions(+), 1 deletion(-) create mode 100644 src/components/navigation-menus/NavigationMenu01.vue create mode 100644 src/components/navigation-menus/NavigationMenu02.vue create mode 100644 src/components/steppers/Stepper01.vue create mode 100644 src/components/steppers/Stepper02.vue create mode 100644 src/components/tables/Table01.vue create mode 100644 src/components/tables/Table02.vue create mode 100644 src/components/ui/NavigationMenu/NavigationMenu.vue create mode 100644 src/components/ui/NavigationMenu/NavigationMenuContent.vue create mode 100644 src/components/ui/NavigationMenu/NavigationMenuIndicator.vue create mode 100644 src/components/ui/NavigationMenu/NavigationMenuItem.vue create mode 100644 src/components/ui/NavigationMenu/NavigationMenuLink.vue create mode 100644 src/components/ui/NavigationMenu/NavigationMenuList.vue create mode 100644 src/components/ui/NavigationMenu/NavigationMenuTrigger.vue create mode 100644 src/components/ui/NavigationMenu/NavigationMenuViewport.vue create mode 100644 src/components/ui/NavigationMenu/index.ts create mode 100644 src/components/ui/NavigationMenu/style.ts create mode 100644 src/components/ui/Stepper/Stepper.vue create mode 100644 src/components/ui/Stepper/StepperDescription.vue create mode 100644 src/components/ui/Stepper/StepperIndicator.vue create mode 100644 src/components/ui/Stepper/StepperItem.vue create mode 100644 src/components/ui/Stepper/StepperSeparator.vue create mode 100644 src/components/ui/Stepper/StepperTitle.vue create mode 100644 src/components/ui/Stepper/StepperTrigger.vue create mode 100644 src/components/ui/Stepper/index.ts create mode 100644 src/components/ui/Table/Table.vue create mode 100644 src/components/ui/Table/TableBody.vue create mode 100644 src/components/ui/Table/TableCaption.vue create mode 100644 src/components/ui/Table/TableCell.vue create mode 100644 src/components/ui/Table/TableFooter.vue create mode 100644 src/components/ui/Table/TableHead.vue create mode 100644 src/components/ui/Table/TableHeader.vue create mode 100644 src/components/ui/Table/TableRow.vue create mode 100644 src/components/ui/Table/index.ts create mode 100644 src/views/NavigationMenus.vue create mode 100644 src/views/Steppers.vue create mode 100644 src/views/Tables.vue diff --git a/README.md b/README.md index 7029de0..c4e40c4 100644 --- a/README.md +++ b/README.md @@ -168,6 +168,9 @@ If you want to use the helpers used in some components you need to copy the `src - Progress - Pagination - Dropdown Menu +- Table +- Stepper +- Navigation Menu - (More components coming soon) ## Contributing diff --git a/src/components/navigation-menus/NavigationMenu01.vue b/src/components/navigation-menus/NavigationMenu01.vue new file mode 100644 index 0000000..eb549e2 --- /dev/null +++ b/src/components/navigation-menus/NavigationMenu01.vue @@ -0,0 +1,45 @@ + + + diff --git a/src/components/navigation-menus/NavigationMenu02.vue b/src/components/navigation-menus/NavigationMenu02.vue new file mode 100644 index 0000000..ba64af9 --- /dev/null +++ b/src/components/navigation-menus/NavigationMenu02.vue @@ -0,0 +1,23 @@ + + + diff --git a/src/components/steppers/Stepper01.vue b/src/components/steppers/Stepper01.vue new file mode 100644 index 0000000..546ef09 --- /dev/null +++ b/src/components/steppers/Stepper01.vue @@ -0,0 +1,33 @@ + + + diff --git a/src/components/steppers/Stepper02.vue b/src/components/steppers/Stepper02.vue new file mode 100644 index 0000000..48bf78d --- /dev/null +++ b/src/components/steppers/Stepper02.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/components/tables/Table01.vue b/src/components/tables/Table01.vue new file mode 100644 index 0000000..0c6f327 --- /dev/null +++ b/src/components/tables/Table01.vue @@ -0,0 +1,40 @@ + + + diff --git a/src/components/tables/Table02.vue b/src/components/tables/Table02.vue new file mode 100644 index 0000000..6586300 --- /dev/null +++ b/src/components/tables/Table02.vue @@ -0,0 +1,50 @@ + + + diff --git a/src/components/ui/NavigationMenu/NavigationMenu.vue b/src/components/ui/NavigationMenu/NavigationMenu.vue new file mode 100644 index 0000000..67fbb20 --- /dev/null +++ b/src/components/ui/NavigationMenu/NavigationMenu.vue @@ -0,0 +1,30 @@ + + + diff --git a/src/components/ui/NavigationMenu/NavigationMenuContent.vue b/src/components/ui/NavigationMenu/NavigationMenuContent.vue new file mode 100644 index 0000000..66a4482 --- /dev/null +++ b/src/components/ui/NavigationMenu/NavigationMenuContent.vue @@ -0,0 +1,31 @@ + + + diff --git a/src/components/ui/NavigationMenu/NavigationMenuIndicator.vue b/src/components/ui/NavigationMenu/NavigationMenuIndicator.vue new file mode 100644 index 0000000..1ccd77f --- /dev/null +++ b/src/components/ui/NavigationMenu/NavigationMenuIndicator.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/components/ui/NavigationMenu/NavigationMenuItem.vue b/src/components/ui/NavigationMenu/NavigationMenuItem.vue new file mode 100644 index 0000000..d0da682 --- /dev/null +++ b/src/components/ui/NavigationMenu/NavigationMenuItem.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/components/ui/NavigationMenu/NavigationMenuLink.vue b/src/components/ui/NavigationMenu/NavigationMenuLink.vue new file mode 100644 index 0000000..51f1257 --- /dev/null +++ b/src/components/ui/NavigationMenu/NavigationMenuLink.vue @@ -0,0 +1,31 @@ + + + diff --git a/src/components/ui/NavigationMenu/NavigationMenuList.vue b/src/components/ui/NavigationMenu/NavigationMenuList.vue new file mode 100644 index 0000000..270918b --- /dev/null +++ b/src/components/ui/NavigationMenu/NavigationMenuList.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/components/ui/NavigationMenu/NavigationMenuTrigger.vue b/src/components/ui/NavigationMenu/NavigationMenuTrigger.vue new file mode 100644 index 0000000..8433b5c --- /dev/null +++ b/src/components/ui/NavigationMenu/NavigationMenuTrigger.vue @@ -0,0 +1,25 @@ + + + diff --git a/src/components/ui/NavigationMenu/NavigationMenuViewport.vue b/src/components/ui/NavigationMenu/NavigationMenuViewport.vue new file mode 100644 index 0000000..0f21561 --- /dev/null +++ b/src/components/ui/NavigationMenu/NavigationMenuViewport.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/components/ui/NavigationMenu/index.ts b/src/components/ui/NavigationMenu/index.ts new file mode 100644 index 0000000..3ac8345 --- /dev/null +++ b/src/components/ui/NavigationMenu/index.ts @@ -0,0 +1,9 @@ +export { default as NavigationMenu } from './NavigationMenu.vue' +export { default as NavigationMenuList } from './NavigationMenuList.vue' +export { default as NavigationMenuItem } from './NavigationMenuItem.vue' +export { default as NavigationMenuTrigger } from './NavigationMenuTrigger.vue' +export { default as NavigationMenuContent } from './NavigationMenuContent.vue' +export { default as NavigationMenuLink } from './NavigationMenuLink.vue' +export { default as NavigationMenuIndicator } from './NavigationMenuIndicator.vue' +export { default as NavigationMenuViewport } from './NavigationMenuViewport.vue' +export { navigationMenuTriggerStyle } from './style' diff --git a/src/components/ui/NavigationMenu/style.ts b/src/components/ui/NavigationMenu/style.ts new file mode 100644 index 0000000..0ecb781 --- /dev/null +++ b/src/components/ui/NavigationMenu/style.ts @@ -0,0 +1,5 @@ +import { cva } from 'class-variance-authority' + +export const navigationMenuTriggerStyle = cva( + 'group inline-flex h-9 w-max items-center justify-center rounded-lg bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-64 data-[state=open]:bg-accent/50 data-[active]:bg-accent/50' +) diff --git a/src/components/ui/Stepper/Stepper.vue b/src/components/ui/Stepper/Stepper.vue new file mode 100644 index 0000000..abdb3c0 --- /dev/null +++ b/src/components/ui/Stepper/Stepper.vue @@ -0,0 +1,23 @@ + + + diff --git a/src/components/ui/Stepper/StepperDescription.vue b/src/components/ui/Stepper/StepperDescription.vue new file mode 100644 index 0000000..52158e5 --- /dev/null +++ b/src/components/ui/Stepper/StepperDescription.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/components/ui/Stepper/StepperIndicator.vue b/src/components/ui/Stepper/StepperIndicator.vue new file mode 100644 index 0000000..45e1622 --- /dev/null +++ b/src/components/ui/Stepper/StepperIndicator.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/components/ui/Stepper/StepperItem.vue b/src/components/ui/Stepper/StepperItem.vue new file mode 100644 index 0000000..9f63d08 --- /dev/null +++ b/src/components/ui/Stepper/StepperItem.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/components/ui/Stepper/StepperSeparator.vue b/src/components/ui/Stepper/StepperSeparator.vue new file mode 100644 index 0000000..a136188 --- /dev/null +++ b/src/components/ui/Stepper/StepperSeparator.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/components/ui/Stepper/StepperTitle.vue b/src/components/ui/Stepper/StepperTitle.vue new file mode 100644 index 0000000..3a9bf1f --- /dev/null +++ b/src/components/ui/Stepper/StepperTitle.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/components/ui/Stepper/StepperTrigger.vue b/src/components/ui/Stepper/StepperTrigger.vue new file mode 100644 index 0000000..bd6b858 --- /dev/null +++ b/src/components/ui/Stepper/StepperTrigger.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/components/ui/Stepper/index.ts b/src/components/ui/Stepper/index.ts new file mode 100644 index 0000000..e17c112 --- /dev/null +++ b/src/components/ui/Stepper/index.ts @@ -0,0 +1,7 @@ +export { default as Stepper } from './Stepper.vue' +export { default as StepperItem } from './StepperItem.vue' +export { default as StepperTrigger } from './StepperTrigger.vue' +export { default as StepperIndicator } from './StepperIndicator.vue' +export { default as StepperTitle } from './StepperTitle.vue' +export { default as StepperDescription } from './StepperDescription.vue' +export { default as StepperSeparator } from './StepperSeparator.vue' diff --git a/src/components/ui/Table/Table.vue b/src/components/ui/Table/Table.vue new file mode 100644 index 0000000..f579d5f --- /dev/null +++ b/src/components/ui/Table/Table.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/Table/TableBody.vue b/src/components/ui/Table/TableBody.vue new file mode 100644 index 0000000..8c41111 --- /dev/null +++ b/src/components/ui/Table/TableBody.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components/ui/Table/TableCaption.vue b/src/components/ui/Table/TableCaption.vue new file mode 100644 index 0000000..84354a8 --- /dev/null +++ b/src/components/ui/Table/TableCaption.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components/ui/Table/TableCell.vue b/src/components/ui/Table/TableCell.vue new file mode 100644 index 0000000..44a3177 --- /dev/null +++ b/src/components/ui/Table/TableCell.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/Table/TableFooter.vue b/src/components/ui/Table/TableFooter.vue new file mode 100644 index 0000000..bacc122 --- /dev/null +++ b/src/components/ui/Table/TableFooter.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/Table/TableHead.vue b/src/components/ui/Table/TableHead.vue new file mode 100644 index 0000000..e234ce5 --- /dev/null +++ b/src/components/ui/Table/TableHead.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/components/ui/Table/TableHeader.vue b/src/components/ui/Table/TableHeader.vue new file mode 100644 index 0000000..57b39d9 --- /dev/null +++ b/src/components/ui/Table/TableHeader.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components/ui/Table/TableRow.vue b/src/components/ui/Table/TableRow.vue new file mode 100644 index 0000000..d7e196e --- /dev/null +++ b/src/components/ui/Table/TableRow.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/components/ui/Table/index.ts b/src/components/ui/Table/index.ts new file mode 100644 index 0000000..d4e4fdd --- /dev/null +++ b/src/components/ui/Table/index.ts @@ -0,0 +1,8 @@ +export { default as Table } from './Table.vue' +export { default as TableHeader } from './TableHeader.vue' +export { default as TableBody } from './TableBody.vue' +export { default as TableFooter } from './TableFooter.vue' +export { default as TableRow } from './TableRow.vue' +export { default as TableHead } from './TableHead.vue' +export { default as TableCell } from './TableCell.vue' +export { default as TableCaption } from './TableCaption.vue' diff --git a/src/router/index.ts b/src/router/index.ts index 80d3d66..dcf1e0b 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -104,6 +104,24 @@ const router = createRouter({ name: 'dropdowns', component: () => import('@/views/Dropdowns.vue'), meta: { title: 'coss-ui-vue/dropdowns' } + }, + { + path: '/tables', + name: 'tables', + component: () => import('@/views/Tables.vue'), + meta: { title: 'coss-ui-vue/tables' } + }, + { + path: '/steppers', + name: 'steppers', + component: () => import('@/views/Steppers.vue'), + meta: { title: 'coss-ui-vue/steppers' } + }, + { + path: '/navigation-menus', + name: 'navigation-menus', + component: () => import('@/views/NavigationMenus.vue'), + meta: { title: 'coss-ui-vue/navigation-menus' } } ] }) diff --git a/src/views/Home.vue b/src/views/Home.vue index 932d8c5..9b5721e 100644 --- a/src/views/Home.vue +++ b/src/views/Home.vue @@ -80,7 +80,10 @@ const availableComponents = [ { name: 'Breadcrumb', path: '/breadcrumbs' }, { name: 'Progress', path: '/progress' }, { name: 'Pagination', path: '/pagination' }, - { name: 'Dropdown Menu', path: '/dropdowns' } + { name: 'Dropdown Menu', path: '/dropdowns' }, + { name: 'Table', path: '/tables' }, + { name: 'Stepper', path: '/steppers' }, + { name: 'Navigation Menu', path: '/navigation-menus' } ] useHead({ diff --git a/src/views/NavigationMenus.vue b/src/views/NavigationMenus.vue new file mode 100644 index 0000000..60510ea --- /dev/null +++ b/src/views/NavigationMenus.vue @@ -0,0 +1,39 @@ + + + diff --git a/src/views/Steppers.vue b/src/views/Steppers.vue new file mode 100644 index 0000000..9063117 --- /dev/null +++ b/src/views/Steppers.vue @@ -0,0 +1,39 @@ + + + diff --git a/src/views/Tables.vue b/src/views/Tables.vue new file mode 100644 index 0000000..781cb5a --- /dev/null +++ b/src/views/Tables.vue @@ -0,0 +1,39 @@ + + +