@sigx/zero-daisyui 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -265,6 +265,15 @@ declare module '@sigx/zero' {
265
265
  axes: { 'shape': 'circle' | 'square' | 'rounded' };
266
266
  mods: Record<string, never>;
267
267
  };
268
+ /** avatar-group — color, size wired. */
269
+ 'avatar-group': {
270
+ color: 'primary' | 'secondary' | 'accent' | 'neutral' | 'info' | 'success' | 'warning' | 'error';
271
+ size: 'xs' | 'sm' | 'lg' | 'xl' | 'md';
272
+ /** Accepts `variant` at runtime, but no daisyui recipe wires it — the attribute would match nothing. */
273
+ variant: never;
274
+ axes: Record<string, never>;
275
+ mods: Record<string, never>;
276
+ };
268
277
  /** toast — color, size wired. */
269
278
  'toast': {
270
279
  color: 'primary' | 'secondary' | 'accent' | 'neutral' | 'info' | 'success' | 'warning' | 'error';
package/dist/report.json CHANGED
@@ -10,8 +10,8 @@
10
10
  "score": 100,
11
11
  "weight": 25,
12
12
  "detail": {
13
- "styled": 63,
14
- "total": 63
13
+ "styled": 64,
14
+ "total": 64
15
15
  }
16
16
  },
17
17
  "vocabulary": {
@@ -62,8 +62,8 @@
62
62
  }
63
63
  },
64
64
  "coverage": {
65
- "componentsStyled": 63,
66
- "componentsTotal": 63,
65
+ "componentsStyled": 64,
66
+ "componentsTotal": 64,
67
67
  "unstyled": []
68
68
  },
69
69
  "vocabulary": {
@@ -543,6 +543,75 @@
543
543
  }
544
544
  }
545
545
  },
546
+ "avatar-group": {
547
+ "styled": true,
548
+ "axes": {
549
+ "color": {
550
+ "wired": [
551
+ "accent",
552
+ "error",
553
+ "info",
554
+ "neutral",
555
+ "primary",
556
+ "secondary",
557
+ "success",
558
+ "warning"
559
+ ],
560
+ "status": "wired"
561
+ },
562
+ "size": {
563
+ "wired": [
564
+ "lg",
565
+ "md",
566
+ "sm",
567
+ "xl",
568
+ "xs"
569
+ ],
570
+ "status": "wired"
571
+ },
572
+ "variant": {
573
+ "wired": [],
574
+ "status": "unwired"
575
+ }
576
+ },
577
+ "customAxes": {},
578
+ "mods": [],
579
+ "never": [
580
+ "variant"
581
+ ],
582
+ "parts": {
583
+ "root": {
584
+ "styled": true,
585
+ "states": {
586
+ "covered": [],
587
+ "coveredIndirectly": [],
588
+ "skipped": [],
589
+ "uncovered": []
590
+ },
591
+ "flags": {
592
+ "covered": [],
593
+ "coveredIndirectly": [],
594
+ "skipped": [],
595
+ "uncovered": []
596
+ }
597
+ },
598
+ "overflow": {
599
+ "styled": true,
600
+ "states": {
601
+ "covered": [],
602
+ "coveredIndirectly": [],
603
+ "skipped": [],
604
+ "uncovered": []
605
+ },
606
+ "flags": {
607
+ "covered": [],
608
+ "coveredIndirectly": [],
609
+ "skipped": [],
610
+ "uncovered": []
611
+ }
612
+ }
613
+ }
614
+ },
546
615
  "badge": {
547
616
  "styled": true,
548
617
  "axes": {
@@ -8267,6 +8336,16 @@
8267
8336
  "success",
8268
8337
  "warning"
8269
8338
  ],
8339
+ "avatar-group": [
8340
+ "accent",
8341
+ "error",
8342
+ "info",
8343
+ "neutral",
8344
+ "primary",
8345
+ "secondary",
8346
+ "success",
8347
+ "warning"
8348
+ ],
8270
8349
  "badge": [
8271
8350
  "accent",
8272
8351
  "error",
@@ -8947,6 +9026,13 @@
8947
9026
  "xl",
8948
9027
  "xs"
8949
9028
  ],
9029
+ "avatar-group": [
9030
+ "lg",
9031
+ "md",
9032
+ "sm",
9033
+ "xl",
9034
+ "xs"
9035
+ ],
8950
9036
  "badge": [
8951
9037
  "lg",
8952
9038
  "md",
@@ -9743,8 +9829,8 @@
9743
9829
  "contrast": [
9744
9830
  {
9745
9831
  "name": "light",
9746
- "cells": 3310,
9747
- "measured": 2900,
9832
+ "cells": 3311,
9833
+ "measured": 2901,
9748
9834
  "failing": 0,
9749
9835
  "warnings": 324,
9750
9836
  "disabledFailing": 0,
@@ -9819,8 +9905,8 @@
9819
9905
  },
9820
9906
  {
9821
9907
  "name": "dark",
9822
- "cells": 3310,
9823
- "measured": 2900,
9908
+ "cells": 3311,
9909
+ "measured": 2901,
9824
9910
  "failing": 0,
9825
9911
  "warnings": 168,
9826
9912
  "disabledFailing": 0,
@@ -9895,8 +9981,8 @@
9895
9981
  },
9896
9982
  {
9897
9983
  "name": "dim",
9898
- "cells": 3310,
9899
- "measured": 2900,
9984
+ "cells": 3311,
9985
+ "measured": 2901,
9900
9986
  "failing": 0,
9901
9987
  "warnings": 269,
9902
9988
  "disabledFailing": 0,
@@ -9971,8 +10057,8 @@
9971
10057
  },
9972
10058
  {
9973
10059
  "name": "nord",
9974
- "cells": 3310,
9975
- "measured": 2900,
10060
+ "cells": 3311,
10061
+ "measured": 2901,
9976
10062
  "failing": 0,
9977
10063
  "warnings": 1231,
9978
10064
  "disabledFailing": 0,
@@ -10047,8 +10133,8 @@
10047
10133
  },
10048
10134
  {
10049
10135
  "name": "sunset",
10050
- "cells": 3310,
10051
- "measured": 2900,
10136
+ "cells": 3311,
10137
+ "measured": 2901,
10052
10138
  "failing": 0,
10053
10139
  "warnings": 268,
10054
10140
  "disabledFailing": 0,
@@ -10338,6 +10424,18 @@
10338
10424
  "detail": "calc-holding custom-property chain inlined: value substituted into 2 consumer declaration(s) across 5 compound(s) and the definition dropped — lynx drops any declaration consuming var() of a property whose value holds calc() (measured, signalxjs/lynx#1075)",
10339
10425
  "scope": "avatar"
10340
10426
  },
10427
+ {
10428
+ "where": "lynx recipe for \"avatar-group\".\"root\"",
10429
+ "what": "display: inline-flex",
10430
+ "detail": "rewritten to display: flex — lynx has no inline formatting context, and an unsupported display value keeps the default linear layout (signalxjs/lynx#1075)",
10431
+ "scope": "avatar-group"
10432
+ },
10433
+ {
10434
+ "where": "lynx recipe for \"avatar-group\"",
10435
+ "what": "--avatar-group-size",
10436
+ "detail": "calc-holding custom-property chain inlined: value substituted into 2 consumer declaration(s) across 5 compound(s) and the definition dropped — lynx drops any declaration consuming var() of a property whose value holds calc() (measured, signalxjs/lynx#1075)",
10437
+ "scope": "avatar-group"
10438
+ },
10341
10439
  {
10342
10440
  "where": "lynx recipe for \"combobox\".\"root\"",
10343
10441
  "what": "display: inline-flex",
@@ -10455,7 +10553,7 @@
10455
10553
  {
10456
10554
  "where": "lynx recipe for \"divider\"",
10457
10555
  "what": "--divider-thickness",
10458
- "detail": "calc-holding custom-property chain inlined: value substituted into 0 consumer declaration(s) across 5 compound(s) and the definition dropped — lynx drops any declaration consuming var() of a property whose value holds calc() (measured, signalxjs/lynx#1075)",
10556
+ "detail": "calc-holding custom-property chain inlined: value substituted into 2 consumer declaration(s) across 5 compound(s) and the definition dropped — lynx drops any declaration consuming var() of a property whose value holds calc() (measured, signalxjs/lynx#1075)",
10459
10557
  "scope": "divider"
10460
10558
  },
10461
10559
  {
@@ -11617,6 +11715,96 @@
11617
11715
  "detail": "not expressible in the class grammar — dropped; supply a lynx replacement in the recipe target section",
11618
11716
  "scope": "avatar"
11619
11717
  },
11718
+ {
11719
+ "where": "lynx recipe for \"avatar-group\".\"overflow\"",
11720
+ "what": "paddingInline: var(--space-2xs)",
11721
+ "detail": "padding-inline resolves on iOS but not on Android (measured, signalxjs/lynx#1084) — cross-platform-asymmetric, treated as unsupported; dropped, restate the geometry with a physical spelling (top/right/bottom/left, margin-*/padding-*) in the recipe's lynx target section",
11722
+ "scope": "avatar-group"
11723
+ },
11724
+ {
11725
+ "where": "lynx recipe for \"avatar-group\".\"overflow\"",
11726
+ "what": "marginInlineStart: calc(var(--avatar-group-size) * -0.25)",
11727
+ "detail": "margin-inline-start resolves on iOS but not on Android (measured, signalxjs/lynx#1084) — cross-platform-asymmetric, treated as unsupported; dropped, restate the geometry with a physical spelling (top/right/bottom/left, margin-*/padding-*) in the recipe's lynx target section",
11728
+ "scope": "avatar-group"
11729
+ },
11730
+ {
11731
+ "where": "lynx recipe for \"avatar-group\"",
11732
+ "what": "composes[\"avatar\"]",
11733
+ "detail": "a nested scope styled in context has no class form on this target — dropped; the nested component keeps its own recipe",
11734
+ "scope": "avatar-group"
11735
+ },
11736
+ {
11737
+ "where": "lynx recipe for \"avatar-group\"",
11738
+ "what": "compoundVariants[0].composes[\"avatar\"]",
11739
+ "detail": "a nested scope styled in context has no class form on this target — dropped; the nested component keeps its own recipe",
11740
+ "scope": "avatar-group"
11741
+ },
11742
+ {
11743
+ "where": "lynx recipe for \"avatar-group\"",
11744
+ "what": "compoundVariants[1].composes[\"avatar\"]",
11745
+ "detail": "a nested scope styled in context has no class form on this target — dropped; the nested component keeps its own recipe",
11746
+ "scope": "avatar-group"
11747
+ },
11748
+ {
11749
+ "where": "lynx recipe for \"avatar-group\"",
11750
+ "what": "compoundVariants[2].composes[\"avatar\"]",
11751
+ "detail": "a nested scope styled in context has no class form on this target — dropped; the nested component keeps its own recipe",
11752
+ "scope": "avatar-group"
11753
+ },
11754
+ {
11755
+ "where": "lynx recipe for \"avatar-group\"",
11756
+ "what": "compoundVariants[3].composes[\"avatar\"]",
11757
+ "detail": "a nested scope styled in context has no class form on this target — dropped; the nested component keeps its own recipe",
11758
+ "scope": "avatar-group"
11759
+ },
11760
+ {
11761
+ "where": "lynx recipe for \"avatar-group\"",
11762
+ "what": "compoundVariants[4].composes[\"avatar\"]",
11763
+ "detail": "a nested scope styled in context has no class form on this target — dropped; the nested component keeps its own recipe",
11764
+ "scope": "avatar-group"
11765
+ },
11766
+ {
11767
+ "where": "lynx recipe for \"avatar-group\"",
11768
+ "what": "compoundVariants[5].composes[\"avatar\"]",
11769
+ "detail": "a nested scope styled in context has no class form on this target — dropped; the nested component keeps its own recipe",
11770
+ "scope": "avatar-group"
11771
+ },
11772
+ {
11773
+ "where": "lynx recipe for \"avatar-group\"",
11774
+ "what": "compoundVariants[6].composes[\"avatar\"]",
11775
+ "detail": "a nested scope styled in context has no class form on this target — dropped; the nested component keeps its own recipe",
11776
+ "scope": "avatar-group"
11777
+ },
11778
+ {
11779
+ "where": "lynx recipe for \"avatar-group\"",
11780
+ "what": "compoundVariants[7].composes[\"avatar\"]",
11781
+ "detail": "a nested scope styled in context has no class form on this target — dropped; the nested component keeps its own recipe",
11782
+ "scope": "avatar-group"
11783
+ },
11784
+ {
11785
+ "where": "lynx recipe for \"avatar-group\"",
11786
+ "what": "compoundVariants[8].composes[\"avatar\"]",
11787
+ "detail": "a nested scope styled in context has no class form on this target — dropped; the nested component keeps its own recipe",
11788
+ "scope": "avatar-group"
11789
+ },
11790
+ {
11791
+ "where": "lynx recipe for \"avatar-group\"",
11792
+ "what": "compoundVariants[9].composes[\"avatar\"]",
11793
+ "detail": "a nested scope styled in context has no class form on this target — dropped; the nested component keeps its own recipe",
11794
+ "scope": "avatar-group"
11795
+ },
11796
+ {
11797
+ "where": "lynx recipe for \"avatar-group\"",
11798
+ "what": "compoundVariants[10].composes[\"avatar\"]",
11799
+ "detail": "a nested scope styled in context has no class form on this target — dropped; the nested component keeps its own recipe",
11800
+ "scope": "avatar-group"
11801
+ },
11802
+ {
11803
+ "where": "lynx recipe for \"avatar-group\"",
11804
+ "what": "compoundVariants[11].composes[\"avatar\"]",
11805
+ "detail": "a nested scope styled in context has no class form on this target — dropped; the nested component keeps its own recipe",
11806
+ "scope": "avatar-group"
11807
+ },
11620
11808
  {
11621
11809
  "where": "lynx recipe for \"toast\".\"viewport\"",
11622
11810
  "what": "selectors[\"&:popover-open\"]",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sigx/zero-daisyui",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "DaisyUI-flavored design system for SignalX Zero — daisy's token values and component look as a pure tokens+recipes skin over @sigx/zero primitives. No Tailwind, no daisyUI plugin required.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -62,12 +62,12 @@
62
62
  "url": "https://github.com/signalxjs/zero/issues"
63
63
  },
64
64
  "peerDependencies": {
65
- "@sigx/zero": "^0.8.0"
65
+ "@sigx/zero": "^0.9.0"
66
66
  },
67
67
  "devDependencies": {
68
68
  "typescript": "^7.0.2",
69
- "@sigx/zero": "^0.8.0",
70
- "@sigx/zero-kit": "^0.8.0"
69
+ "@sigx/zero": "^0.9.0",
70
+ "@sigx/zero-kit": "^0.9.0"
71
71
  },
72
72
  "publishConfig": {
73
73
  "access": "public"
package/src/recipes.ts CHANGED
@@ -3599,6 +3599,100 @@ export const avatar: RecipeInput = {
3599
3599
  },
3600
3600
  };
3601
3601
 
3602
+ /**
3603
+ * Avatar group (#297) — daisy's `avatar-group`: the faces overlap by a
3604
+ * quarter, each already cut out by the avatar's own base-100 gap ring, and the
3605
+ * "+N" chip is daisy's `avatar-placeholder` (neutral fill, neutral-content
3606
+ * ink, a circle) wearing the same ring. The group's `size` borrows the
3607
+ * avatar's own size step (`composes`), so a group sizes its faces without a
3608
+ * prop on each, and an avatar's own `size` still wins. Colour is daisy's
3609
+ * ring colour: it rings the chip, and it is borrowed by the avatars too, so
3610
+ * one `color` on the group rings every face alike.
3611
+ */
3612
+ const avatarGroupSteps: Record<string, [string, string]> = {
3613
+ xs: ['calc(var(--size-selector) * 6)', 'var(--text-xs)'],
3614
+ sm: ['calc(var(--size-selector) * 8)', 'var(--text-xs)'],
3615
+ lg: ['calc(var(--size-selector) * 12)', 'var(--text-md)'],
3616
+ xl: ['calc(var(--size-selector) * 16)', 'var(--text-lg)'],
3617
+ };
3618
+
3619
+ export const avatarGroup: RecipeInput = {
3620
+ component: 'avatar-group',
3621
+ tokens: {
3622
+ '--avatar-group-size': 'calc(var(--size-selector) * 10)',
3623
+ '--avatar-group-text': 'var(--text-sm)',
3624
+ '--avatar-group-ring': 'var(--color-primary)',
3625
+ },
3626
+ parts: {
3627
+ root: {
3628
+ base: {
3629
+ display: 'inline-flex',
3630
+ alignItems: 'center',
3631
+ verticalAlign: 'middle',
3632
+ isolation: 'isolate',
3633
+ },
3634
+ },
3635
+ overflow: {
3636
+ base: {
3637
+ // Positioned like the avatars, or it would paint under the
3638
+ // face it overlaps.
3639
+ position: 'relative',
3640
+ display: 'inline-grid',
3641
+ placeItems: 'center',
3642
+ boxSizing: 'border-box',
3643
+ minWidth: 'var(--avatar-group-size)',
3644
+ height: 'var(--avatar-group-size)',
3645
+ paddingInline: 'var(--space-2xs)',
3646
+ marginInlineStart: 'calc(var(--avatar-group-size) * -0.25)',
3647
+ borderRadius: '9999px',
3648
+ boxShadow: '0 0 0 2px var(--color-base-100), 0 0 0 4px var(--avatar-group-ring)',
3649
+ background: 'var(--color-neutral)',
3650
+ color: 'var(--color-neutral-content)',
3651
+ fontSize: 'var(--avatar-group-text)',
3652
+ fontWeight: 'var(--weight-semibold)',
3653
+ fontVariantNumeric: 'tabular-nums',
3654
+ whiteSpace: 'nowrap',
3655
+ userSelect: 'none',
3656
+ },
3657
+ },
3658
+ },
3659
+ composes: {
3660
+ avatar: {
3661
+ parts: {
3662
+ root: {
3663
+ selectors: {
3664
+ '&:not(:first-child)': { marginInlineStart: 'calc(var(--avatar-group-size) * -0.25)' },
3665
+ },
3666
+ },
3667
+ },
3668
+ },
3669
+ },
3670
+ compoundVariants: [
3671
+ ...Object.keys(avatarGroupSteps).map((size) => ({
3672
+ match: { size },
3673
+ parts: {},
3674
+ composes: { avatar: { axes: { size } } },
3675
+ })),
3676
+ ...ROLES.map((color) => ({
3677
+ match: { color },
3678
+ parts: {},
3679
+ composes: { avatar: { axes: { color } } },
3680
+ })),
3681
+ ],
3682
+ variants: {
3683
+ color: Object.fromEntries(ROLES.map((c) => [c, { root: { base: {
3684
+ '--avatar-group-ring': `var(--color-${c})`,
3685
+ } } }])),
3686
+ size: {
3687
+ ...Object.fromEntries(Object.entries(avatarGroupSteps).map(([size, [box, text]]) => [size, { root: { base: {
3688
+ '--avatar-group-size': box, '--avatar-group-text': text,
3689
+ } } }])),
3690
+ // `md` is the un-attributed render — the defaults in `tokens:`.
3691
+ md: {},
3692
+ },
3693
+ },
3694
+ };
3695
+
3602
3696
  /**
3603
3697
  * A toast whose indicator is rendered (#292): the grid grows a leading column
3604
3698
  * for the mark, and the text, action and close step one column along.
@@ -5527,6 +5621,25 @@ export const divider: RecipeInput = {
5527
5621
  xl: { root: { base: { '--divider-thickness': 'calc(var(--border) * 3)' } } },
5528
5622
  },
5529
5623
  },
5624
+ targets: {
5625
+ lynx: {
5626
+ parts: {
5627
+ // Lynx drops the ::before/::after segments the rule is drawn
5628
+ // with above, which left the lynx divider with no line and,
5629
+ // since only those rules read `--divider-thickness`, no size
5630
+ // ramp either (#375). There the root itself is the line, as
5631
+ // it was before the segments (#356): filled with the ink and
5632
+ // one thickness across.
5633
+ root: {
5634
+ base: { background: 'var(--divider-ink)' },
5635
+ selectors: {
5636
+ '&[data-orientation="horizontal"]': { blockSize: 'var(--divider-thickness)' },
5637
+ '&[data-orientation="vertical"]': { inlineSize: 'var(--divider-thickness)' },
5638
+ },
5639
+ },
5640
+ },
5641
+ },
5642
+ },
5530
5643
  };
5531
5644
 
5532
5645
  // ── Loading (#314) ────────────────────────────────────────────────────────
@@ -8151,7 +8264,7 @@ export const diff: RecipeInput = {
8151
8264
 
8152
8265
  export const recipes: RecipeInput[] = [
8153
8266
  tabs, collapsible, switchRecipe, dialog, popover, tooltip, hoverCard, menu, menubar,
8154
- field, fieldset, checkbox, checkboxGroup, radioGroup, progress, slider, accordion, select, button, avatar, toast, combobox,
8267
+ field, fieldset, checkbox, checkboxGroup, radioGroup, progress, slider, accordion, select, button, avatar, avatarGroup, toast, combobox,
8155
8268
  toggle, toggleGroup, numberInput, ratingGroup, treeView, input, textarea,
8156
8269
  card, alert, emptyState, badge, divider, skeleton, spinner,
8157
8270
  kbd, status, indicator, stats, timeline, chat, chatLog, radialProgress, join,