bitboss-ui 3.0.0-beta.20 → 3.0.0-beta.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/ai/BbTable.md +206 -98
  2. package/dist/ai/changelog.json +21 -3
  3. package/dist/ai/components.json +40 -15
  4. package/dist/ai/guides/component-picker.md +18 -18
  5. package/dist/ai/guides/icons-policy.md +7 -3
  6. package/dist/ai/guides/installation-and-plugin-setup.md +11 -14
  7. package/dist/ai/guides/migration/components/bb-table.md +131 -17
  8. package/dist/ai/recipes/inertia/approvals-inbox.md +0 -1
  9. package/dist/ai/recipes/inertia/inline-edit-workspace.md +0 -1
  10. package/dist/ai/recipes/inertia/ownership-atlas.md +8 -9
  11. package/dist/ai/recipes/inertia/record-form.md +0 -1
  12. package/dist/ai/recipes/inertia/records-workspace.md +0 -1
  13. package/dist/ai/recipes/inertia/upload-center.md +0 -1
  14. package/dist/ai/recipes/nuxt/approvals-inbox.md +0 -1
  15. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +0 -1
  16. package/dist/ai/recipes/nuxt/record-form.md +0 -1
  17. package/dist/ai/recipes/nuxt/records-workspace.md +0 -1
  18. package/dist/ai/recipes/nuxt/upload-center.md +0 -1
  19. package/dist/ai/recipes/vue/approvals-inbox.md +0 -1
  20. package/dist/ai/recipes/vue/inline-edit-workspace.md +0 -1
  21. package/dist/ai/recipes/vue/records-workspace.md +0 -1
  22. package/dist/ai/recipes/vue/upload-center.md +0 -1
  23. package/dist/ai/source/BbTable.md +564 -173
  24. package/dist/components/BbTable/BbTable.vue.d.ts +2 -0
  25. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +865 -735
  26. package/dist/components/BbTable/types.d.ts +98 -46
  27. package/dist/components/BbTable/utils.d.ts +21 -16
  28. package/dist/components/BbTable/utils.js +8 -8
  29. package/dist/composables/useTableWidthContext.d.ts +24 -4
  30. package/dist/composables/useTableWidthContext.js +31 -28
  31. package/dist/deprecation/ai-deprecations.json.d.ts +22 -0
  32. package/dist/deprecation/ai-deprecations.json.js +1 -1
  33. package/dist/llms-full.txt +381 -173
  34. package/dist/llms-medium.txt +29 -32
  35. package/dist/vite.js +1 -1
  36. package/package.json +1 -1
  37. package/scripts/lib/eslint-plugin.mjs +9 -14
  38. package/scripts/lib/validate-bb-markup.mjs +0 -7
@@ -426,19 +426,16 @@ goes stable, so never reach for it here.
426
426
 
427
427
  Peer dependency: `vue ^3.5.12` — the only required one. `@inertiajs/vue3` is an **optional** peer, needed only in Inertia apps.
428
428
 
429
- `@iconify/collections` is an **optional** peer too, and npm never installs
430
- optional peers automatically install it yourself if you want the dev-time
431
- provider-icon diagnostics:
432
-
433
- ```bash
434
- npm install -D @iconify/collections
435
- ```
436
-
437
- Without it the plugin has no list of valid Iconify prefixes, so the dev-overlay
438
- errors below (the "install `@iconify-json/<prefix>`" hint and the "did you
439
- mean …?" suggestion for a mistyped icon name) never fire — a wrong provider
440
- icon then surfaces only as `BbIcon`'s generic runtime `Icon "…" does not exist.`
441
- Nothing else changes: icons that resolve still render, in dev and in production.
429
+ You do **not** need `@iconify/collections`. It is declared as an optional peer
430
+ for one reason only: when it happens to be installed, the dev-overlay message
431
+ for an unknown icon prefix can say for certain whether that prefix is a real
432
+ Iconify set ("requires `@iconify-json/mdi`, run …") or not ("neither an
433
+ installed set nor a known Iconify prefix"). Without it the same overlay fires
434
+ with a hedged wording ("no installed icon set has the prefix `mdi`; if it is an
435
+ Iconify set, run …"). A mistyped name inside a set you **have** installed
436
+ (`lucide:eye-misspelled`) is diagnosed from the set's own data in both cases,
437
+ with a "did you mean …?" suggestion. Nothing else changes: icons that resolve
438
+ still render, in dev and in production.
442
439
 
443
440
  **Known-good toolchain:** TypeScript **5.x or 6.x** if your build gate runs
444
441
  `vue-tsc`. Both type-check cleanly against the shipped `.d.ts`; the library
@@ -703,7 +700,7 @@ utilities. (Same trap as the scoped-`<style>` case above, one level up.)
703
700
  ## 6) Icons
704
701
 
705
702
  - `iconDir` (required) is scanned recursively for `.svg` files; each file becomes `local:<basename>`.
706
- - Provider icons (`lucide:pencil`, `mdi:home`, …) require the matching `@iconify-json/<prefix>` package installed in the consumer app. Missing packages/icons produce actionable dev-overlay errors **only when the optional `@iconify/collections` peer is installed** (see [Install](#1-install)); otherwise you get `BbIcon`'s generic runtime error instead. Production builds report neither this is a dev-time aid.
703
+ - Provider icons (`lucide:pencil`, `mdi:home`, …) require the matching `@iconify-json/<prefix>` package installed in the consumer app. In dev, every `prefix:name` the registry does not know produces a Vite error overlay with the fix: a mistyped name inside an installed set gets a "did you mean …?" hint, and an uninstalled prefix gets the list of installed sets plus the `npm install -D @iconify-json/<prefix>` command (the optional `@iconify/collections` peer only sharpens that wording, see [Install](#1-install)). A missing `local:` icon is a missing file in `iconDir` and surfaces as `BbIcon`'s runtime error naming it. Production builds report none of this the scan simply drops what does not resolve, so a wrong name fails at runtime there.
707
704
  - Production builds bundle **only statically referenced** provider icons — write icon names as literal strings (`icon="lucide:trash-2"`), never assemble them dynamically.
708
705
  - The plugin also writes `node_modules/.bitboss-ui/local-icons.json` and (in dev, unless `vscodeSettings: false`) wires `.vscode/settings.json` so the Iconify editor extension previews local icons.
709
706
 
@@ -1227,24 +1224,24 @@ a composable you want is not in this corpus's `composables/` folder — it is no
1227
1224
  here.** Check this list before inventing a name; if the need is genuinely absent,
1228
1225
  compose it or write it yourself.
1229
1226
 
1230
- | Assumed component or composable | Reality |
1231
- | -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1232
- | `BbColumnManager` — show/hide/reorder columns | Does not exist as a component. Order is `v-model:order` on `BbTable` (an array of keys any panel can write; `reorderable` adds the built-in header drag + keyboard handle); visibility is still filtering `columns` the hidden key keeps its slot in the order. Compose the panel from `BbPopover` + `BbCheckbox`. |
1233
- | `BbKanban` / drag-and-drop board | Does not exist. There is no reusable DnD primitive in the library (`BbTable`'s header drag is internal to the table) — compose the board from `BbTable` (a table/list view of the same data) or hand-roll the drag-and-drop interaction yourself. |
1234
- | `BbModal` | It is [BbDialog](../BbDialog.md). |
1235
- | `BbDrawer` / `BbSheet` | It is [BbOffCanvas](../BbOffCanvas.md). |
1236
- | `BbCombobox` / `BbAutocomplete` | It is [BbSelect](../BbSelect.md) / [BbSelectPopover](../BbSelectPopover.md) — search is built in, see `disable-writing`. |
1237
- | `BbToggle` / `BbToggleGroup` | It is [BbButton](../BbButton.md) with `v-model` (+ `true-value` / `false-value`), which owns `aria-pressed` and the active class. |
1238
- | `TagChip` / colored, read-only tag chip | It is [BbBadge](../BbBadge.md) — [BbTag](../BbTag.md) is a tags-_input_ only, not a display component. Use `BbBadge` with a registered `soft-*` variant for a fixed palette, or a one-off `--bg`/`--color` override per row for arbitrary/data-driven colors (BbBadge.md § One-off colors) — not a registered variant per distinct color. |
1239
- | `BbTab` (singular) | The consumer API is [BbTabs](../BbTabs.md) / `BbTabsRoot`. `BbTab` appears only as the **v2 "before" side** of the migration diffs. |
1240
- | `BbCard` | Does not exist — a card is a `<div>` with tokens. See [design-language](./design-language.md). |
1241
- | `BbList` / `BbListItem` / `BbDescriptionList` | Do not exist — a list row is an `<li>` with tokens, and [BbBaseButton](../BbBaseButton.md) makes the whole row navigable. See the note under Data Display. |
1242
- | `useLiveFeed` / any polling or cross-tab feed helper | Does not exist, and neither does a cross-tab helper — `useBroadcastChannelInstance` was removed (cross-tab messaging is not a UI concern). Use `useBroadcastChannel` from `@vueuse/core`; the polling and the merge are yours. |
1243
- | `BbStepper` / `BbWizard` | Does not exist as a component; the wizard-form recipe composes one. |
1244
- | `BbSkeleton` (standalone) | Only `BbTable` ships skeletons, via the column `skeleton` field. |
1245
- | `BbCommand` / command palette | Does not exist. Compose `BbDialog` + `BbSelectPopover`. |
1246
- | `BbCalendar` (month / scheduling view) | Does not exist. [BbDatePicker](../BbDatePicker.md) is a picker, not a calendar surface. |
1247
- | `BbChart` / `BbGraph`, `BbCarousel`, `BbTimeline`, `BbDivider` | Do not exist. No charting, carousel or timeline primitive ships here. |
1227
+ | Assumed component or composable | Reality |
1228
+ | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1229
+ | `BbColumnManager` — show/hide/reorder columns | Does not exist as a component. Order is `v-model:order` on `BbTable` (an array of keys any panel can write; `reorderable` adds the built-in header drag + keyboard handle); visibility is `hidden: true` on the column definition (the column stays declared and keeps its slot in the order; header slots get a `hideColumn()` that fires `hide:column`). Compose the panel from `BbPopover` + `BbCheckbox`. |
1230
+ | `BbKanban` / drag-and-drop board | Does not exist. There is no reusable DnD primitive in the library (`BbTable`'s header drag is internal to the table) — compose the board from `BbTable` (a table/list view of the same data) or hand-roll the drag-and-drop interaction yourself. |
1231
+ | `BbModal` | It is [BbDialog](../BbDialog.md). |
1232
+ | `BbDrawer` / `BbSheet` | It is [BbOffCanvas](../BbOffCanvas.md). |
1233
+ | `BbCombobox` / `BbAutocomplete` | It is [BbSelect](../BbSelect.md) / [BbSelectPopover](../BbSelectPopover.md) — search is built in, see `disable-writing`. |
1234
+ | `BbToggle` / `BbToggleGroup` | It is [BbButton](../BbButton.md) with `v-model` (+ `true-value` / `false-value`), which owns `aria-pressed` and the active class. |
1235
+ | `TagChip` / colored, read-only tag chip | It is [BbBadge](../BbBadge.md) — [BbTag](../BbTag.md) is a tags-_input_ only, not a display component. Use `BbBadge` with a registered `soft-*` variant for a fixed palette, or a one-off `--bg`/`--color` override per row for arbitrary/data-driven colors (BbBadge.md § One-off colors) — not a registered variant per distinct color. |
1236
+ | `BbTab` (singular) | The consumer API is [BbTabs](../BbTabs.md) / `BbTabsRoot`. `BbTab` appears only as the **v2 "before" side** of the migration diffs. |
1237
+ | `BbCard` | Does not exist — a card is a `<div>` with tokens. See [design-language](./design-language.md). |
1238
+ | `BbList` / `BbListItem` / `BbDescriptionList` | Do not exist — a list row is an `<li>` with tokens, and [BbBaseButton](../BbBaseButton.md) makes the whole row navigable. See the note under Data Display. |
1239
+ | `useLiveFeed` / any polling or cross-tab feed helper | Does not exist, and neither does a cross-tab helper — `useBroadcastChannelInstance` was removed (cross-tab messaging is not a UI concern). Use `useBroadcastChannel` from `@vueuse/core`; the polling and the merge are yours. |
1240
+ | `BbStepper` / `BbWizard` | Does not exist as a component; the wizard-form recipe composes one. |
1241
+ | `BbSkeleton` (standalone) | Only `BbTable` ships skeletons, via the column `skeleton` field. |
1242
+ | `BbCommand` / command palette | Does not exist. Compose `BbDialog` + `BbSelectPopover`. |
1243
+ | `BbCalendar` (month / scheduling view) | Does not exist. [BbDatePicker](../BbDatePicker.md) is a picker, not a calendar surface. |
1244
+ | `BbChart` / `BbGraph`, `BbCarousel`, `BbTimeline`, `BbDivider` | Do not exist. No charting, carousel or timeline primitive ships here. |
1248
1245
 
1249
1246
  App chrome — an app shell, sidebar, page header, selection dock — is
1250
1247
  deliberately **not** a component: it is yours to own. The per-platform
package/dist/vite.js CHANGED
@@ -646,7 +646,7 @@ function tt(t) {
646
646
  let t = b(e);
647
647
  return t ? [`\t${JSON.stringify(e)}: () => import(${JSON.stringify(Q + t.prefix + "/" + t.name)}).then(m => m.default),`] : [];
648
648
  }).join("\n");
649
- return `const _local = import.meta.glob(${JSON.stringify(a)}, { query: '?raw', import: 'default' });\nconst _localIcons = Object.fromEntries(Object.entries(_local).map(([k, l]) => { const f = k.split(/[/\\\\]+/).pop(); return [\`local:\${f.replace(/\\.svg$/i, '')}\`, l]; }));\nconst _icons = {\n` + (u ? u + "\n" : "") + `\t..._localIcons,\n};\nconst _ip = new Set(${JSON.stringify(Array.from(_))});\nconst _loaded = new Set(${JSON.stringify(Array.from(m.keys()))});\nexport const icons = import.meta.env.DEV\n\t? new Proxy(_icons, {\n\t\tget(t, k) {\n\t\t\tif (k in t || typeof k !== 'string' || !k.includes(':')) return t[k];\n\t\t\tconst _c = k.indexOf(':'); const _p = k.slice(0, _c); const _n = k.slice(_c + 1);\n\t\t\tif (!_ip.has(_p) || !/^[a-z][a-z0-9-]*$/.test(_n)) return undefined;\n\t\t\tif (_loaded.has(_p)) return () => { const _e = new Error(); const _names = Object.keys(t).filter(x => x.startsWith(_p + ':')).map(x => x.slice(_c + 1)); const _sq = _n.replace(/-/g, ''); const _sug = _names.find(x => x.replace(/-/g, '') === _sq) ?? (_n.length >= 3 ? _names.find(x => x.includes(_n) || (x.length >= 3 && _n.includes(x))) : undefined); const _msg = \`[bitboss-ui] icon "\${k}" does not exist in the \${_p} icon set\` + (_sug ? \` — did you mean "\${_p}:\${_sug}"?\` : ''); import.meta.hot?.send('bitboss-ui:icon-missing', { msg: _msg, stack: _e.stack }); return Promise.reject(new Error(_msg)); };\n\t\t\tconst _pkg = \`@iconify-json/\${_p}\`;\n\t\t\treturn () => { const _e = new Error(); import.meta.hot?.send('bitboss-ui:icon-missing', { msg: \`[bitboss-ui] "\${k}" requires "\${_pkg}" run: npm install -D \${_pkg}\`, stack: _e.stack }); return Promise.reject(new Error(\`[bitboss-ui] "\${k}" requires "\${_pkg}" run: npm install -D \${_pkg}\`)); };\n\t\t},\n\t})\n\t: _icons;\n`;
649
+ return `const _local = import.meta.glob(${JSON.stringify(a)}, { query: '?raw', import: 'default' });\nconst _localIcons = Object.fromEntries(Object.entries(_local).map(([k, l]) => { const f = k.split(/[/\\\\]+/).pop(); return [\`local:\${f.replace(/\\.svg$/i, '')}\`, l]; }));\nconst _icons = {\n` + (u ? u + "\n" : "") + `\t..._localIcons,\n};\nconst _ip = new Set(${JSON.stringify(Array.from(_))});\nconst _loaded = new Set(${JSON.stringify(Array.from(m.keys()))});\nconst _installed = _loaded.size ? \`installed sets: \${[..._loaded].join(', ')}\` : 'no @iconify-json/* set is installed';\nconst _fail = (msg) => () => { const _e = new Error(); import.meta.hot?.send('bitboss-ui:icon-missing', { msg, stack: _e.stack }); return Promise.reject(new Error(msg)); };\nexport const icons = import.meta.env.DEV\n\t? new Proxy(_icons, {\n\t\tget(t, k) {\n\t\t\tif (k in t || typeof k !== 'string' || !k.includes(':')) return t[k];\n\t\t\tconst _c = k.indexOf(':'); const _p = k.slice(0, _c); const _n = k.slice(_c + 1);\n\t\t\tif (_p === 'local' || !/^[a-z][a-z0-9-]*$/.test(_p) || !/^[a-z][a-z0-9-]*$/.test(_n)) return undefined;\n\t\t\tif (_loaded.has(_p)) { const _names = Object.keys(t).filter(x => x.startsWith(_p + ':')).map(x => x.slice(_c + 1)); const _sq = _n.replace(/-/g, ''); const _sug = _names.find(x => x.replace(/-/g, '') === _sq) ?? (_n.length >= 3 ? _names.find(x => x.includes(_n) || (x.length >= 3 && _n.includes(x))) : undefined); return _fail(\`[bitboss-ui] icon "\${k}" does not exist in the \${_p} icon set\` + (_sug ? \` — did you mean "\${_p}:\${_sug}"?\` : '')); }\n\t\t\tconst _pkg = \`@iconify-json/\${_p}\`; const _cmd = \`run: npm install -D \${_pkg}\`;\n\t\t\tif (_ip.has(_p)) return _fail(\`[bitboss-ui] "\${k}" requires "\${_pkg}" \${_cmd} (\${_installed})\`);\n\t\t\tif (_ip.size) return _fail(\`[bitboss-ui] "\${k}" "\${_p}" is neither an installed icon set nor a known Iconify prefix (\${_installed})\`);\n\t\t\treturn _fail(\`[bitboss-ui] "\${k}" no installed icon set has the prefix "\${_p}" (\${_installed}). If "\${_p}" is an Iconify set, \${_cmd}\`);\n\t\t},\n\t})\n\t: _icons;\n`;
650
650
  },
651
651
  buildStart() {
652
652
  v(), q(f(r, n.iconDir), r), !i && n.vscodeSettings !== !1 && Z(r, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bitboss-ui",
3
- "version": "3.0.0-beta.20",
3
+ "version": "3.0.0-beta.21",
4
4
  "description": "Vue 3 component library by BitBoss: forms, selects, layout, overlays, and more.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -413,22 +413,17 @@ function attrBinding(startTag, camelName) {
413
413
  /**
414
414
  * `#slot` name ↔ gating prop pairs on `BbTable`. Each of these slots is
415
415
  * rendered from a `v-if`/coherence check on the paired prop/model
416
- * (`BbTable.vue`: `v-if="actions"`, `v-if="selectable"`, `v-if="item.expanded"`
417
- * — itself driven by whatever `expandedItems` holds) — so a template that
418
- * fills the slot but never sets the prop compiles clean, ships clean, and
419
- * renders nothing, with no warning anywhere (W6-R1). `header:actions` /
420
- * `header:select` share the same gating prop as their row-level counterpart
421
- * and are deliberately NOT listed separately flagging `#actions` already
422
- * catches the same missing `actions` prop.
416
+ * (`BbTable.vue`: `v-if="selectable"`, `v-if="item.expanded"` — itself driven
417
+ * by whatever `expandedItems` holds) — so a template that fills the slot but
418
+ * never sets the prop compiles clean, ships clean, and renders nothing, with
419
+ * no warning anywhere (W6-R1). `header:select` shares the same gating prop
420
+ * as its row-level counterpart and is deliberately NOT listed separately —
421
+ * flagging `#select` already catches the same missing `selectable` prop.
422
+ * `#actions` is NOT a pair any more: since 2026-09-07 the slot itself creates
423
+ * the actions column (the `actions` prop was retired), so an `#actions`
424
+ * template can never be orphaned.
423
425
  */
424
426
  const TABLE_SLOT_PROP_PAIRS = [
425
- {
426
- slot: 'actions',
427
- prop: 'actions',
428
- missing: 'the `actions` prop is not set',
429
- explain: 'the actions cell — and this slot — never renders',
430
- action: 'Set the `actions` prop',
431
- },
432
427
  {
433
428
  slot: 'select',
434
429
  prop: 'selectable',
@@ -884,13 +884,6 @@ export function checkNavAttrFallthrough(manifest, name, attrName) {
884
884
  * `check` alone shipped orphan slots believing the markup was clean (SWP-015).
885
885
  */
886
886
  export const TABLE_SLOT_PROP_PAIRS = [
887
- {
888
- slot: 'actions',
889
- prop: 'actions',
890
- missing: 'the `actions` prop is not set',
891
- explain: 'the actions cell — and this slot — never renders',
892
- action: 'Set the `actions` prop',
893
- },
894
887
  {
895
888
  slot: 'select',
896
889
  prop: 'selectable',