Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
139 commits
Select commit Hold shift + click to select a range
89946b3
refactor: replace variant/size props with boolean flags in Button
markusand Apr 30, 2026
c99e2c7
feat: resolve icons via Icon, default to Lucide CDN
markusand Apr 30, 2026
006e6c5
fix: re-inline SVG on directive update and fix cache clone
markusand Apr 30, 2026
b78e9f5
fix: AvatarGroup modifier class binding
markusand Apr 30, 2026
2ce7f59
feat: add arrow key icons to HotKey
markusand May 1, 2026
d82d17d
fix: use x.svg instead of close.svg for clear icons
markusand May 2, 2026
2b747fb
feat: refactor Dropdown to use focus-based open state
markusand May 2, 2026
9032dca
refactor: rename .disabled to .is-disabled class
markusand May 2, 2026
b805829
refactor: replace ContextualMenu with ActionMenu
markusand May 2, 2026
bd69bf9
feat: add CSS variable for HotKey font size
markusand May 2, 2026
5519448
refactor: move useId out of computed in Popover
markusand May 2, 2026
436b5a7
refactor: drop props. prefix and use withDefaults
markusand May 2, 2026
a9bdeb4
fix: use shrink icon for collapse state in ImageExpand
markusand May 2, 2026
0569c8f
feat: default CalendarNames locale to browser language
markusand May 2, 2026
154b839
fix: linting issues
markusand May 2, 2026
e14a2c6
fix(Selector): remove redundant isSelected check
markusand May 2, 2026
a6f2abd
refactor(Modal): replace open prop with v-model:open
markusand May 2, 2026
079eec5
refactor(Collapser): use useId() for default name generation
markusand May 2, 2026
adc75a6
refactor(Button): make variant and size props mutually exclusive
markusand May 3, 2026
d15671a
fix(Selector): narrow DropdownProps to explicit Pick
markusand May 3, 2026
9634728
refactor: remove redundant undefined defaults from props
markusand May 3, 2026
c58a408
refactor(DatePicker): remove redundant v-if wrapper in toggler
markusand May 3, 2026
5eecb8e
refactor(DatePicker): narrow layout props via DropdownProps Pick
markusand May 3, 2026
79fc20f
chore: fix linting
markusand May 3, 2026
af38230
refactor: migrate CSS classes to BEM naming convention
markusand May 5, 2026
5a075b8
refactor: make Toggler really tabeable
markusand May 5, 2026
72196c1
refactor(Toggler): inline check icon as embedded SVG
markusand May 6, 2026
bb1f50a
refactor: improve keyboard focus styles
markusand May 6, 2026
d4255f4
fix: stylelint and CSS linting issues
markusand May 6, 2026
c9d6cfc
docs(DatePicker): remove Hebrew locale from story options
markusand May 6, 2026
12a9515
refactor: remove dead code
markusand May 6, 2026
1315d98
refactor(Avatar): enhance Avatar
markusand May 6, 2026
b26546a
refactor: simplify Accordion and Collapser
markusand May 6, 2026
48eb3f8
refactor(Calendar): inline calendar logic and enrich day objects
markusand May 6, 2026
1d696b1
fix(Carousel): layering for controls overlay
markusand May 6, 2026
f90170b
refactor: unify class binding style across components
markusand May 7, 2026
24217df
refactor(Transfer): explicit return type on width computed
markusand May 7, 2026
901f39a
refactor: inline props references in Pagination and Stepper
markusand May 7, 2026
6d2e6d3
fix(Popover): bordered arrow and outline on anchor
markusand May 7, 2026
4959617
refactor: replace local block classes with is-block utility
markusand May 7, 2026
d4192b3
refactor: remove redundant local toggler classes
markusand May 7, 2026
46ed9e8
refactor(Calendar): rename invalid/valid props to excluded/allowed
markusand May 7, 2026
8c4cfdf
refactor(styles): merge is-input and is-selector-toggler shared rules
markusand May 7, 2026
8220896
refactor(styles): replace local state classes with shared utilities
markusand May 7, 2026
24ec194
fix: add missing typed slots
markusand May 7, 2026
376282c
refactor: export every component props types
markusand May 7, 2026
b7b4c46
refactor: make optional slots explicitly optional
markusand May 7, 2026
6ca4bb8
fix: name exported component Props
markusand May 7, 2026
8f0cf19
fix: default K generic to string in ActionMenu types
markusand May 7, 2026
f2071ef
feat: enhance FileDrop
markusand May 7, 2026
dac08d7
refactor: use Tab type alias in Tabs component
markusand May 7, 2026
fe67e7f
refactor: remove stray semicolon in ButtonGroup styles
markusand May 7, 2026
fb83c51
docs: add Carousel stories
markusand May 7, 2026
8615043
refactor: wrap Avatar badge in inner .badge element
markusand May 8, 2026
8b25822
refactor: rename Chip `close` to `action`
markusand May 8, 2026
ebb1ab2
refactor: nest Tabs CSS rules and move focus to active style
markusand May 8, 2026
0b27886
refactor: replace `radio` bool with `group` name in Toggler
markusand May 8, 2026
ecbe6d2
feat: add `toggle` emit event to Switch
markusand May 8, 2026
bbd1480
feat(stories): add custom slot example to ActionMenu story
markusand May 8, 2026
e619d65
feat(Rating): use CSS `:has` selector to fix star highlight direction
markusand May 8, 2026
5edf4f5
feat: add roving tabindex composable
markusand May 8, 2026
4511039
feat(DatePicker): add DatePicker presets panel
markusand May 8, 2026
11ba89a
feat(stories): enhance Divider story with ButtonGroup slot example
markusand May 8, 2026
2aa37df
feat(Pagination): enhance and bugfix Pagination
markusand May 8, 2026
c8897b2
feat(TreeList): add roving tabindex keyboard navigation
markusand May 9, 2026
190669e
refactor: adjust divider color equilibrium
markusand May 11, 2026
5045620
fix(Calendar): do not select invalid dates in range
markusand May 11, 2026
2948f70
refactor: standardise CSS custom properties across components
markusand May 13, 2026
0856c32
feat!: Remove Accordion
markusand May 23, 2026
3c13a9a
refactor(Collapser): simplify markup and use native details-content a…
markusand May 24, 2026
b3efb19
refactor(Modal): simplify markup and add CSS entry/exit animations
markusand May 24, 2026
2b16af9
refactor: standardise transitions and add microinteractions across co…
markusand May 24, 2026
813d8e7
refactor(TreeList): simplify markup and add native details-content an…
markusand May 24, 2026
b25f24a
refactor(Dropdown): always render overlay and animate with CSS opacity
markusand May 24, 2026
85a76aa
refactor(Popover): add entry/exit animations
markusand May 24, 2026
07797e0
refactor(ImageExpand): replace Teleport with dialog and View Transiti…
markusand May 24, 2026
26d6247
fix(Carousel): scrollTo for reliable Chrome navigation, roving tabind…
markusand May 24, 2026
ce1fb1a
feat(Tabs): animated TabView transitions with directional awareness
markusand May 24, 2026
425de42
fix(a11y): add ARIA semantics and labels across components
markusand May 24, 2026
6ddd6f7
docs: complete theming documentation
markusand May 24, 2026
a0a711c
docs(skill): expand use-bocins-ui skill with overlay patterns and com…
markusand May 24, 2026
4aafe3f
feat(Slider): add Slider component
markusand May 25, 2026
3fad5b6
feat: add Progress component
markusand May 25, 2026
4963b38
fix(storybook): assign unique idPrefix per story to prevent useId() c…
markusand May 29, 2026
7b98807
feat(Dropdown): migrate to Popover API with CSS anchor positioning
markusand May 29, 2026
ce5b901
fix(ButtonGroup): simplify border-radius selectors for Popover API fr…
markusand May 29, 2026
885f356
fix(DatePicker): fix props
markusand May 29, 2026
fd04c57
fix(Button): use box-shadow instead of border to prevent spacing errors
markusand May 29, 2026
8b7a735
feat(Dropdown): add position prop with 16-position CSS anchor layout
markusand May 29, 2026
51bc72c
refactor: use span for Dropdown toggler
markusand May 29, 2026
060bff8
refactor(Popover): migrate to Dropdown-based architecture with direct…
markusand May 29, 2026
198099f
fix(Dropdown): apply width to content panel instead of toggler
markusand May 29, 2026
ef2a779
refactor: cleanup legacy
markusand May 29, 2026
dd2690e
feat: expose open close methods in Dropdow-ish
markusand May 29, 2026
d0ebfe3
refactor(stories): overhaul examples with realistic data and shared u…
markusand May 29, 2026
fd71e0d
feat(Slider): add inset prop and expand CSS custom property support
markusand May 30, 2026
4a88b38
refactor: replace focus interactions with focus-visible
markusand May 30, 2026
63966f8
feat: remove invalid story
markusand May 30, 2026
aef45ed
fix(HotKey): use userAgentData to detect Mac, falling back to userAgent
markusand May 31, 2026
ff0f468
refactor(Button, ToggleButton): rename internal --_color-state to --c…
markusand May 31, 2026
dd825cc
fix(Button, Rating): remove unnecessary !important
markusand May 31, 2026
4ab1ad7
fix(Calendar): use chevron-left for previous month instead of CSS-rot…
markusand May 31, 2026
8d05d95
refactor(Calendar): simplify isInvalid allowed condition
markusand May 31, 2026
2502280
fix(ChipsInput): guard splice against indexOf returning -1
markusand May 31, 2026
8940bd6
fix(Collapser): sync isOpen when open prop changes after mount
markusand May 31, 2026
e39d272
fix(Collapser): remove stray space before emit call
markusand May 31, 2026
0c462ff
refactor(DatePicker): merge duplicate imports from /@/utils
markusand May 31, 2026
751fe89
fix(ListBox): use inherit to suppress focus border-color change on em…
markusand May 31, 2026
64d5422
fix(LongText): bind placeholder explicitly on textarea
markusand May 31, 2026
b131e78
fix(Modal): forward $attrs to dialog instead of leaking component pro…
markusand May 31, 2026
4151e22
fix(Popover): replace debug red (#f00) with white as default backgrou…
markusand May 31, 2026
29f9de8
fix(Switch): normalize mixed tab/space indentation in CSS
markusand May 31, 2026
958b8bc
fix(Switch): return proper value on toggle
markusand May 31, 2026
eda3fd9
fix(Tabs): scope transition watcher to only the transition prop
markusand May 31, 2026
77ca0cb
fix(stories): remove useless stories and fix imports
markusand May 31, 2026
3d1c121
refactor(Input): forward native attrs to inner input
markusand May 31, 2026
839a462
fix(styles): use :user-invalid to avoid styling untouched fields
markusand May 31, 2026
5da2f5d
docs: update documentation
markusand May 31, 2026
5fe3af1
feat(PullTo): add PullTo component and stories
markusand May 31, 2026
f396ba8
feat(ActionMenu): add default slot
markusand May 31, 2026
d810e53
fix: stop Buttons bubbling up click event
markusand May 31, 2026
5d520ee
feat: bind @change event for LongText
markusand Jun 4, 2026
ffe2518
fix: hide native Search x icon
markusand Jun 4, 2026
1cf3088
fix: clear useless click handler
markusand Jun 4, 2026
559d5b5
refactor: set Input placeholder explicitly
markusand Jun 4, 2026
c094971
feat: add configruable Modal padding custom property
markusand Jun 4, 2026
46cf213
fix: remove listbox's parent scrolling
markusand Jun 4, 2026
7bcf186
refactor: use non-private custom property for listbox's color
markusand Jun 4, 2026
5557ed2
chore: update dependencies
markusand Jun 4, 2026
df4c3ee
refactor: appply Progress enhancements
markusand Jun 26, 2026
f462225
docs: enhance Tooltip story example
markusand Jun 26, 2026
e8e8662
fix: use color on active ghost ToggleButton
markusand Jun 26, 2026
eb3e2b7
fix: make Tabs scrollable if required
markusand Jun 26, 2026
9cf7b59
feat: make Popover (and Tooltip) hoverable
markusand Jun 26, 2026
31610fe
refactor(Dropdown): use translate custom property
markusand Jun 26, 2026
2042030
refactor(Modal): assign better defaults
markusand Jun 27, 2026
294e1e5
fix(Dropdown): set default translate
markusand Jun 27, 2026
28b1969
fix: prevent Selector to trigger form submits
markusand Jun 28, 2026
660951c
chore: update dependencies
markusand Jun 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@ dist

*storybook.log
storybook-static

!.vscode
9 changes: 0 additions & 9 deletions .prettierignore

This file was deleted.

14 changes: 12 additions & 2 deletions .storybook/main.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,27 @@
import type { StorybookConfig } from "@storybook/vue3-vite";
import remarkGfm from "remark-gfm";

const config: StorybookConfig = {
stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"],

addons: [
"@storybook/addon-links",
"@chromatic-com/storybook",
"@storybook/addon-docs"
{
name: "@storybook/addon-docs",
options: {
mdxPluginOptions: {
mdxCompileOptions: {
remarkPlugins: [remarkGfm],
},
},
},
},
],

framework: {
name: "@storybook/vue3-vite",
options: {},
}
},
};
export default config;
20 changes: 14 additions & 6 deletions .storybook/preview.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import type { Preview } from "@storybook/vue3-vite";
import { getCurrentInstance } from 'vue';
import { config } from '../src/config';

let _storyCount = 0;

const preview: Preview = {
parameters: {
controls: {
Expand All @@ -12,13 +15,18 @@ const preview: Preview = {
},
};

// Reset config before each story to avoid conflicts
export const decorators = [
(story: any) => {
// Always reset to default before rendering any story
config.iconPath = '/icons';
return story();
},
(_story: any) => ({
setup() {
// Give each story's Vue app a unique idPrefix so useId() doesn't
// collide when multiple stories share the same page (docs view).
const app = getCurrentInstance()?.appContext.app;
if (app) app.config.idPrefix = `s${_storyCount++}`;
// Always reset icon config to default before rendering any story.
config.iconPath = 'https://raw.githubusercontent.com/lucide-icons/lucide/refs/heads/main/icons';
},
template: '<story />',
}),
];

export default preview;
4 changes: 3 additions & 1 deletion .stylelintrc
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
"stylelint-config-html/vue"
],
"rules": {
"selector-class-pattern": null
"selector-class-pattern": null,
"selector-pseudo-class-no-unknown": [true, { "ignorePseudoClasses": ["deep"] }],
"custom-property-pattern": "^_?[a-z][a-z0-9]*(-[a-z0-9]+)*$"
}
}
9 changes: 9 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"eslint.useFlatConfig": true,
"eslint.validate": ["javascript", "typescript", "vue"],
"stylelint.validate": ["css", "vue"],
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.fixAll.stylelint": "explicit"
}
}
26 changes: 12 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,7 @@ Install the library
npm i bocins
```

Default icons are copied from `/node_modules/bocins/dist/icons` to `/public/icons/`. Replace them to use your own icons. Existing icons won't be replaced.

To load icons from a custom path (e.g., a CDN), configure the icon path **before** importing components:
By default, Lucide icons are used. To load icons from a custom path (e.g., a CDN), configure the icon path **before** importing components:

```ts
// main.ts
Expand All @@ -42,7 +40,7 @@ import 'bocins/dist/index.css';
@import 'bocins/dist/index.css';
```

You can customize the theme using CSS custom properties and extending some base styles
You can customize the theme using CSS custom properties and extending some base styles. See the full list of available custom properties in the [Theming reference](src/stories/Theming.mdx) or in the [Storybook docs](https://bocins.netlify.app/?path=/docs/configuration-theming--docs).

```css
:root {
Expand All @@ -51,23 +49,23 @@ You can customize the theme using CSS custom properties and extending some base

color-scheme: light dark;

--color-bg: light-dark(#f8f8f8, #333);
--color-text: light-dark(#333, #efefec);
--color-error: #d33;
--color-accent: #39f;
--btn-color: var(--color-accent);
--bg-color: light-dark(#f8f8f8, #333);
--text-color: light-dark(#333, #efefec);
--error-color: #d33;
--accent-color: #39f;
--btn-color: var(--accent-color);
}

body {
background-color: var(--color-bg);
color: var(--color-text);
background-color: var(--bg-color);
color: var(--text-color);
}

.btn[alert] { --color: var(--color-error); }
.btn[delete] { --color: var(--error-color); }

.switch {
--color-on: lightgreen;
--color-off: var(--color-error);
--on-color: lightgreen;
--off-color: var(--error-color);
}
```

Expand Down
2 changes: 2 additions & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export default [
},
},
rules: {
semi: ['error', 'always'],
'max-len': ['error', {
code: 100,
ignoreTrailingComments: true,
Expand All @@ -49,6 +50,7 @@ export default [
}],
'vue/singleline-html-element-content-newline': 'off',
'vue/no-dupe-keys': 'off',
'vue/require-default-prop': 'off',
},
},
{
Expand Down
Loading