@atelier-ui/react 0.0.1

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 (97) hide show
  1. package/package.json +28 -0
  2. package/src/index.d.ts +24 -0
  3. package/src/index.d.ts.map +1 -0
  4. package/src/index.js +24 -0
  5. package/src/index.js.map +1 -0
  6. package/src/lib/accordion/llm-accordion.d.ts +59 -0
  7. package/src/lib/accordion/llm-accordion.d.ts.map +1 -0
  8. package/src/lib/accordion/llm-accordion.js +122 -0
  9. package/src/lib/accordion/llm-accordion.js.map +1 -0
  10. package/src/lib/alert/llm-alert.d.ts +29 -0
  11. package/src/lib/alert/llm-alert.d.ts.map +1 -0
  12. package/src/lib/alert/llm-alert.js +11 -0
  13. package/src/lib/alert/llm-alert.js.map +1 -0
  14. package/src/lib/avatar/llm-avatar.d.ts +58 -0
  15. package/src/lib/avatar/llm-avatar.d.ts.map +1 -0
  16. package/src/lib/avatar/llm-avatar.js +39 -0
  17. package/src/lib/avatar/llm-avatar.js.map +1 -0
  18. package/src/lib/badge/llm-badge.d.ts +25 -0
  19. package/src/lib/badge/llm-badge.d.ts.map +1 -0
  20. package/src/lib/badge/llm-badge.js +11 -0
  21. package/src/lib/badge/llm-badge.js.map +1 -0
  22. package/src/lib/breadcrumbs/llm-breadcrumbs.d.ts +38 -0
  23. package/src/lib/breadcrumbs/llm-breadcrumbs.d.ts.map +1 -0
  24. package/src/lib/breadcrumbs/llm-breadcrumbs.js +28 -0
  25. package/src/lib/breadcrumbs/llm-breadcrumbs.js.map +1 -0
  26. package/src/lib/button/llm-button.d.ts +17 -0
  27. package/src/lib/button/llm-button.d.ts.map +1 -0
  28. package/src/lib/button/llm-button.js +21 -0
  29. package/src/lib/button/llm-button.js.map +1 -0
  30. package/src/lib/card/llm-card.d.ts +52 -0
  31. package/src/lib/card/llm-card.d.ts.map +1 -0
  32. package/src/lib/card/llm-card.js +30 -0
  33. package/src/lib/card/llm-card.js.map +1 -0
  34. package/src/lib/checkbox/llm-checkbox.d.ts +41 -0
  35. package/src/lib/checkbox/llm-checkbox.d.ts.map +1 -0
  36. package/src/lib/checkbox/llm-checkbox.js +29 -0
  37. package/src/lib/checkbox/llm-checkbox.js.map +1 -0
  38. package/src/lib/dialog/llm-dialog.d.ts +68 -0
  39. package/src/lib/dialog/llm-dialog.d.ts.map +1 -0
  40. package/src/lib/dialog/llm-dialog.js +76 -0
  41. package/src/lib/dialog/llm-dialog.js.map +1 -0
  42. package/src/lib/drawer/llm-drawer.d.ts +64 -0
  43. package/src/lib/drawer/llm-drawer.d.ts.map +1 -0
  44. package/src/lib/drawer/llm-drawer.js +83 -0
  45. package/src/lib/drawer/llm-drawer.js.map +1 -0
  46. package/src/lib/input/llm-input.d.ts +41 -0
  47. package/src/lib/input/llm-input.d.ts.map +1 -0
  48. package/src/lib/input/llm-input.js +25 -0
  49. package/src/lib/input/llm-input.js.map +1 -0
  50. package/src/lib/menu/llm-menu.d.ts +66 -0
  51. package/src/lib/menu/llm-menu.d.ts.map +1 -0
  52. package/src/lib/menu/llm-menu.js +64 -0
  53. package/src/lib/menu/llm-menu.js.map +1 -0
  54. package/src/lib/pagination/llm-pagination.d.ts +33 -0
  55. package/src/lib/pagination/llm-pagination.d.ts.map +1 -0
  56. package/src/lib/pagination/llm-pagination.js +54 -0
  57. package/src/lib/pagination/llm-pagination.js.map +1 -0
  58. package/src/lib/progress/llm-progress.d.ts +33 -0
  59. package/src/lib/progress/llm-progress.d.ts.map +1 -0
  60. package/src/lib/progress/llm-progress.js +18 -0
  61. package/src/lib/progress/llm-progress.js.map +1 -0
  62. package/src/lib/radio/llm-radio.d.ts +25 -0
  63. package/src/lib/radio/llm-radio.d.ts.map +1 -0
  64. package/src/lib/radio/llm-radio.js +23 -0
  65. package/src/lib/radio/llm-radio.js.map +1 -0
  66. package/src/lib/radio-group/llm-radio-group.d.ts +84 -0
  67. package/src/lib/radio-group/llm-radio-group.d.ts.map +1 -0
  68. package/src/lib/radio-group/llm-radio-group.js +40 -0
  69. package/src/lib/radio-group/llm-radio-group.js.map +1 -0
  70. package/src/lib/select/llm-select.d.ts +58 -0
  71. package/src/lib/select/llm-select.d.ts.map +1 -0
  72. package/src/lib/select/llm-select.js +26 -0
  73. package/src/lib/select/llm-select.js.map +1 -0
  74. package/src/lib/skeleton/llm-skeleton.d.ts +29 -0
  75. package/src/lib/skeleton/llm-skeleton.d.ts.map +1 -0
  76. package/src/lib/skeleton/llm-skeleton.js +27 -0
  77. package/src/lib/skeleton/llm-skeleton.js.map +1 -0
  78. package/src/lib/tabs/llm-tabs.d.ts +53 -0
  79. package/src/lib/tabs/llm-tabs.d.ts.map +1 -0
  80. package/src/lib/tabs/llm-tabs.js +75 -0
  81. package/src/lib/tabs/llm-tabs.js.map +1 -0
  82. package/src/lib/textarea/llm-textarea.d.ts +33 -0
  83. package/src/lib/textarea/llm-textarea.d.ts.map +1 -0
  84. package/src/lib/textarea/llm-textarea.js +39 -0
  85. package/src/lib/textarea/llm-textarea.js.map +1 -0
  86. package/src/lib/toast/llm-toast.d.ts +54 -0
  87. package/src/lib/toast/llm-toast.d.ts.map +1 -0
  88. package/src/lib/toast/llm-toast.js +70 -0
  89. package/src/lib/toast/llm-toast.js.map +1 -0
  90. package/src/lib/toggle/llm-toggle.d.ts +29 -0
  91. package/src/lib/toggle/llm-toggle.d.ts.map +1 -0
  92. package/src/lib/toggle/llm-toggle.js +23 -0
  93. package/src/lib/toggle/llm-toggle.js.map +1 -0
  94. package/src/lib/tooltip/llm-tooltip.d.ts +17 -0
  95. package/src/lib/tooltip/llm-tooltip.d.ts.map +1 -0
  96. package/src/lib/tooltip/llm-tooltip.js +68 -0
  97. package/src/lib/tooltip/llm-tooltip.js.map +1 -0
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@atelier-ui/react",
3
+ "version": "0.0.1",
4
+ "description": "Atelier UI component library for React — LLM-optimised, accessible, design-token-driven",
5
+ "keywords": [
6
+ "react",
7
+ "ui",
8
+ "components",
9
+ "design-system",
10
+ "atelier-ui",
11
+ "llm"
12
+ ],
13
+ "author": "Atelier UI",
14
+ "license": "MIT",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/DominikPieper/atelier-ui.git",
18
+ "directory": "libs/react"
19
+ },
20
+ "peerDependencies": {
21
+ "react": "^18.0.0 || ^19.0.0",
22
+ "react-dom": "^18.0.0 || ^19.0.0",
23
+ "@atelier-ui/spec": "*"
24
+ },
25
+ "types": "./src/index.d.ts",
26
+ "main": "./src/index.js",
27
+ "type": "commonjs"
28
+ }
package/src/index.d.ts ADDED
@@ -0,0 +1,24 @@
1
+ export * from './lib/accordion/llm-accordion';
2
+ export * from './lib/alert/llm-alert';
3
+ export * from './lib/avatar/llm-avatar';
4
+ export * from './lib/badge/llm-badge';
5
+ export * from './lib/breadcrumbs/llm-breadcrumbs';
6
+ export * from './lib/button/llm-button';
7
+ export * from './lib/card/llm-card';
8
+ export * from './lib/checkbox/llm-checkbox';
9
+ export * from './lib/dialog/llm-dialog';
10
+ export * from './lib/drawer/llm-drawer';
11
+ export * from './lib/input/llm-input';
12
+ export * from './lib/menu/llm-menu';
13
+ export * from './lib/pagination/llm-pagination';
14
+ export * from './lib/progress/llm-progress';
15
+ export * from './lib/radio-group/llm-radio-group';
16
+ export * from './lib/radio/llm-radio';
17
+ export * from './lib/select/llm-select';
18
+ export * from './lib/skeleton/llm-skeleton';
19
+ export * from './lib/tabs/llm-tabs';
20
+ export * from './lib/textarea/llm-textarea';
21
+ export * from './lib/toast/llm-toast';
22
+ export * from './lib/toggle/llm-toggle';
23
+ export * from './lib/tooltip/llm-tooltip';
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../libs/react/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mCAAmC,CAAC;AAClD,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC"}
package/src/index.js ADDED
@@ -0,0 +1,24 @@
1
+ export * from './lib/accordion/llm-accordion';
2
+ export * from './lib/alert/llm-alert';
3
+ export * from './lib/avatar/llm-avatar';
4
+ export * from './lib/badge/llm-badge';
5
+ export * from './lib/breadcrumbs/llm-breadcrumbs';
6
+ export * from './lib/button/llm-button';
7
+ export * from './lib/card/llm-card';
8
+ export * from './lib/checkbox/llm-checkbox';
9
+ export * from './lib/dialog/llm-dialog';
10
+ export * from './lib/drawer/llm-drawer';
11
+ export * from './lib/input/llm-input';
12
+ export * from './lib/menu/llm-menu';
13
+ export * from './lib/pagination/llm-pagination';
14
+ export * from './lib/progress/llm-progress';
15
+ export * from './lib/radio-group/llm-radio-group';
16
+ export * from './lib/radio/llm-radio';
17
+ export * from './lib/select/llm-select';
18
+ export * from './lib/skeleton/llm-skeleton';
19
+ export * from './lib/tabs/llm-tabs';
20
+ export * from './lib/textarea/llm-textarea';
21
+ export * from './lib/toast/llm-toast';
22
+ export * from './lib/toggle/llm-toggle';
23
+ export * from './lib/tooltip/llm-tooltip';
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/react/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mCAAmC,CAAC;AAClD,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC","sourcesContent":["export * from './lib/accordion/llm-accordion';\nexport * from './lib/alert/llm-alert';\nexport * from './lib/avatar/llm-avatar';\nexport * from './lib/badge/llm-badge';\nexport * from './lib/breadcrumbs/llm-breadcrumbs';\nexport * from './lib/button/llm-button';\nexport * from './lib/card/llm-card';\nexport * from './lib/checkbox/llm-checkbox';\nexport * from './lib/dialog/llm-dialog';\nexport * from './lib/drawer/llm-drawer';\nexport * from './lib/input/llm-input';\nexport * from './lib/menu/llm-menu';\nexport * from './lib/pagination/llm-pagination';\nexport * from './lib/progress/llm-progress';\nexport * from './lib/radio-group/llm-radio-group';\nexport * from './lib/radio/llm-radio';\nexport * from './lib/select/llm-select';\nexport * from './lib/skeleton/llm-skeleton';\nexport * from './lib/tabs/llm-tabs';\nexport * from './lib/textarea/llm-textarea';\nexport * from './lib/toast/llm-toast';\nexport * from './lib/toggle/llm-toggle';\nexport * from './lib/tooltip/llm-tooltip';\n"]}
@@ -0,0 +1,59 @@
1
+ import { ReactNode, HTMLAttributes } from 'react';
2
+ import type { LlmAccordionGroupSpec, LlmAccordionItemSpec } from '@atelier-ui/spec';
3
+ import './llm-accordion.css';
4
+ /**
5
+ * Properties for the LlmAccordionGroup component.
6
+ */
7
+ export interface LlmAccordionGroupProps extends HTMLAttributes<HTMLDivElement>, LlmAccordionGroupSpec {
8
+ /**
9
+ * Whether multiple items can be expanded simultaneously.
10
+ */
11
+ multi?: boolean;
12
+ /**
13
+ * The visual style variant of the accordion.
14
+ */
15
+ variant?: 'default' | 'bordered' | 'separated';
16
+ /**
17
+ * The accordion items to be rendered.
18
+ */
19
+ children?: ReactNode;
20
+ }
21
+ /**
22
+ * A container component that manages a group of accordion items.
23
+ */
24
+ export declare function LlmAccordionGroup({ multi, variant, children, className, ...rest }: LlmAccordionGroupProps): import("react/jsx-runtime").JSX.Element;
25
+ /**
26
+ * Properties for the LlmAccordionItem component.
27
+ */
28
+ export interface LlmAccordionItemProps extends HTMLAttributes<HTMLDivElement>, LlmAccordionItemSpec {
29
+ /**
30
+ * Whether the item is currently expanded.
31
+ */
32
+ expanded?: boolean;
33
+ /**
34
+ * Callback triggered when the expanded state changes.
35
+ */
36
+ onExpandedChange?: (expanded: boolean) => void;
37
+ /**
38
+ * Whether the accordion item is disabled.
39
+ */
40
+ disabled?: boolean;
41
+ /**
42
+ * The content of the accordion item, typically including an LlmAccordionHeader.
43
+ */
44
+ children?: ReactNode;
45
+ }
46
+ /**
47
+ * An individual item within an accordion group.
48
+ */
49
+ export declare function LlmAccordionItem({ expanded: externalExpanded, onExpandedChange, disabled, children, className, ...rest }: LlmAccordionItemProps): import("react/jsx-runtime").JSX.Element;
50
+ /**
51
+ * The header component for an LlmAccordionItem.
52
+ */
53
+ export declare function LlmAccordionHeader({ children, className, ...rest }: HTMLAttributes<HTMLSpanElement> & {
54
+ /**
55
+ * The content to be rendered in the header.
56
+ */
57
+ children?: ReactNode;
58
+ }): import("react/jsx-runtime").JSX.Element;
59
+ //# sourceMappingURL=llm-accordion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-accordion.d.ts","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/accordion/llm-accordion.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQL,SAAS,EACT,cAAc,EAEf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,qBAAqB,CAAC;AAoB7B;;GAEG;AACH,MAAM,WAAW,sBACf,SAAQ,cAAc,CAAC,cAAc,CAAC,EACpC,qBAAqB;IACvB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;OAEG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAC/C;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,KAAa,EACb,OAAmB,EACnB,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,EAAE,sBAAsB,2CA+DxB;AAED;;GAEG;AACH,MAAM,WAAW,qBACf,SAAQ,cAAc,CAAC,cAAc,CAAC,EACpC,oBAAoB;IACtB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EAAE,gBAAgB,EAC1B,gBAAgB,EAChB,QAAgB,EAChB,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,EAAE,qBAAqB,2CAmGvB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,EAAE,cAAc,CAAC,eAAe,CAAC,GAAG;IACnC;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,2CASA"}
@@ -0,0 +1,122 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { createContext, useContext, useState, useRef, useId, useLayoutEffect, useCallback, } from 'react';
3
+ import './llm-accordion.css';
4
+ const AccordionGroupContext = createContext({
5
+ multi: false,
6
+ openItems: new Set(),
7
+ toggleItem: () => { },
8
+ registerItem: () => { },
9
+ unregisterItem: () => { },
10
+ handleKeydown: () => { },
11
+ });
12
+ /**
13
+ * A container component that manages a group of accordion items.
14
+ */
15
+ export function LlmAccordionGroup({ multi = false, variant = 'default', children, className, ...rest }) {
16
+ const [openItems, setOpenItems] = useState(new Set());
17
+ const itemsRef = useRef([]);
18
+ const classes = ['llm-accordion-group', `variant-${variant}`, className]
19
+ .filter(Boolean)
20
+ .join(' ');
21
+ const toggleItem = useCallback((id) => {
22
+ setOpenItems((prev) => {
23
+ const next = new Set(prev);
24
+ if (next.has(id)) {
25
+ next.delete(id);
26
+ }
27
+ else {
28
+ if (!multi)
29
+ next.clear();
30
+ next.add(id);
31
+ }
32
+ return next;
33
+ });
34
+ }, [multi]);
35
+ const registerItem = useCallback((id, ref, disabled) => {
36
+ itemsRef.current = [...itemsRef.current.filter((i) => i.id !== id), { id, triggerRef: ref, disabled }];
37
+ }, []);
38
+ const unregisterItem = useCallback((id) => {
39
+ itemsRef.current = itemsRef.current.filter((i) => i.id !== id);
40
+ }, []);
41
+ const handleKeydown = useCallback((e, currentId) => {
42
+ const enabled = itemsRef.current.filter((i) => !i.disabled);
43
+ if (enabled.length === 0)
44
+ return;
45
+ const pos = enabled.findIndex((i) => i.id === currentId);
46
+ const n = enabled.length;
47
+ let target = null;
48
+ if (e.key === 'ArrowDown') {
49
+ e.preventDefault();
50
+ target = enabled[(pos + 1) % n];
51
+ }
52
+ else if (e.key === 'ArrowUp') {
53
+ e.preventDefault();
54
+ target = enabled[(pos - 1 + n) % n];
55
+ }
56
+ else if (e.key === 'Home') {
57
+ e.preventDefault();
58
+ target = enabled[0];
59
+ }
60
+ else if (e.key === 'End') {
61
+ e.preventDefault();
62
+ target = enabled[n - 1];
63
+ }
64
+ target?.triggerRef.current?.focus();
65
+ }, []);
66
+ return (_jsx(AccordionGroupContext.Provider, { value: { multi, openItems, toggleItem, registerItem, unregisterItem, handleKeydown }, children: _jsx("div", { className: classes, role: "presentation", ...rest, children: children }) }));
67
+ }
68
+ /**
69
+ * An individual item within an accordion group.
70
+ */
71
+ export function LlmAccordionItem({ expanded: externalExpanded, onExpandedChange, disabled = false, children, className, ...rest }) {
72
+ const ctx = useContext(AccordionGroupContext);
73
+ const id = useId();
74
+ const triggerId = `${id}-trigger`;
75
+ const panelId = `${id}-panel`;
76
+ const triggerRef = useRef(null);
77
+ const { registerItem, unregisterItem } = ctx;
78
+ // Register/unregister with parent
79
+ useLayoutEffect(() => {
80
+ registerItem(id, triggerRef, disabled);
81
+ return () => unregisterItem(id);
82
+ }, [id, triggerRef, disabled, registerItem, unregisterItem]);
83
+ const isControlled = externalExpanded !== undefined;
84
+ const isExpanded = isControlled ? externalExpanded : ctx.openItems.has(id);
85
+ const toggle = () => {
86
+ if (disabled)
87
+ return;
88
+ const next = !isExpanded;
89
+ if (!isControlled)
90
+ ctx.toggleItem(id);
91
+ onExpandedChange?.(next);
92
+ };
93
+ const classes = [
94
+ 'llm-accordion-item',
95
+ isExpanded && 'is-expanded',
96
+ disabled && 'is-disabled',
97
+ className,
98
+ ]
99
+ .filter(Boolean)
100
+ .join(' ');
101
+ // Separate header child from body children
102
+ const childArray = Array.isArray(children) ? children : [children];
103
+ const headerNode = childArray.find((c) => typeof c === 'object' &&
104
+ c !== null &&
105
+ 'type' in c &&
106
+ c.type === LlmAccordionHeader);
107
+ const bodyNodes = childArray.filter((c) => c !== headerNode);
108
+ return (_jsxs("div", { className: classes, ...rest, children: [_jsx("h3", { className: "accordion-heading", children: _jsxs("button", { ref: triggerRef, type: "button", id: triggerId, className: ['accordion-trigger', disabled && 'is-disabled']
109
+ .filter(Boolean)
110
+ .join(' '), "aria-expanded": isExpanded, "aria-controls": panelId, "aria-disabled": disabled || undefined, disabled: disabled, onClick: toggle, onKeyDown: (e) => ctx.handleKeydown(e, id), children: [headerNode, _jsx("svg", { className: ['chevron', isExpanded && 'is-expanded']
111
+ .filter(Boolean)
112
+ .join(' '), width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: _jsx("path", { d: "M4 6L8 10L12 6", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) })] }) }), _jsx("div", { className: ['accordion-panel-wrapper', isExpanded && 'is-expanded']
113
+ .filter(Boolean)
114
+ .join(' '), children: _jsx("div", { id: panelId, role: "region", "aria-labelledby": triggerId, className: "accordion-panel", children: bodyNodes }) })] }));
115
+ }
116
+ /**
117
+ * The header component for an LlmAccordionItem.
118
+ */
119
+ export function LlmAccordionHeader({ children, className, ...rest }) {
120
+ return (_jsx("span", { className: ['accordion-header-content', className].filter(Boolean).join(' '), ...rest, children: children }));
121
+ }
122
+ //# sourceMappingURL=llm-accordion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-accordion.js","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/accordion/llm-accordion.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n createContext,\n useContext,\n useState,\n useRef,\n useId,\n useLayoutEffect,\n useCallback,\n ReactNode,\n HTMLAttributes,\n KeyboardEvent,\n} from 'react';\nimport type {\n LlmAccordionGroupSpec,\n LlmAccordionItemSpec,\n} from '@atelier-ui/spec';\nimport './llm-accordion.css';\n\ninterface AccordionGroupContextValue {\n multi: boolean;\n openItems: Set<string>;\n toggleItem: (id: string) => void;\n registerItem: (id: string, ref: React.RefObject<HTMLButtonElement | null>, disabled: boolean) => void;\n unregisterItem: (id: string) => void;\n handleKeydown: (e: KeyboardEvent, id: string) => void;\n}\n\nconst AccordionGroupContext = createContext<AccordionGroupContextValue>({\n multi: false,\n openItems: new Set(),\n toggleItem: () => { /* noop */ },\n registerItem: () => { /* noop */ },\n unregisterItem: () => { /* noop */ },\n handleKeydown: () => { /* noop */ },\n});\n\n/**\n * Properties for the LlmAccordionGroup component.\n */\nexport interface LlmAccordionGroupProps\n extends HTMLAttributes<HTMLDivElement>,\n LlmAccordionGroupSpec {\n /**\n * Whether multiple items can be expanded simultaneously.\n */\n multi?: boolean;\n /**\n * The visual style variant of the accordion.\n */\n variant?: 'default' | 'bordered' | 'separated';\n /**\n * The accordion items to be rendered.\n */\n children?: ReactNode;\n}\n\n/**\n * A container component that manages a group of accordion items.\n */\nexport function LlmAccordionGroup({\n multi = false,\n variant = 'default',\n children,\n className,\n ...rest\n}: LlmAccordionGroupProps) {\n const [openItems, setOpenItems] = useState<Set<string>>(new Set());\n const itemsRef = useRef<{ id: string; triggerRef: React.RefObject<HTMLButtonElement | null>; disabled: boolean }[]>([]);\n\n const classes = ['llm-accordion-group', `variant-${variant}`, className]\n .filter(Boolean)\n .join(' ');\n\n const toggleItem = useCallback((id: string) => {\n setOpenItems((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n if (!multi) next.clear();\n next.add(id);\n }\n return next;\n });\n }, [multi]);\n\n const registerItem = useCallback((id: string, ref: React.RefObject<HTMLButtonElement | null>, disabled: boolean) => {\n itemsRef.current = [...itemsRef.current.filter((i) => i.id !== id), { id, triggerRef: ref, disabled }];\n }, []);\n\n const unregisterItem = useCallback((id: string) => {\n itemsRef.current = itemsRef.current.filter((i) => i.id !== id);\n }, []);\n\n const handleKeydown = useCallback((e: KeyboardEvent, currentId: string) => {\n const enabled = itemsRef.current.filter((i) => !i.disabled);\n if (enabled.length === 0) return;\n\n const pos = enabled.findIndex((i) => i.id === currentId);\n const n = enabled.length;\n let target: (typeof enabled)[0] | null = null;\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n target = enabled[(pos + 1) % n];\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n target = enabled[(pos - 1 + n) % n];\n } else if (e.key === 'Home') {\n e.preventDefault();\n target = enabled[0];\n } else if (e.key === 'End') {\n e.preventDefault();\n target = enabled[n - 1];\n }\n\n target?.triggerRef.current?.focus();\n }, []);\n\n return (\n <AccordionGroupContext.Provider\n value={{ multi, openItems, toggleItem, registerItem, unregisterItem, handleKeydown }}\n >\n <div className={classes} role=\"presentation\" {...rest}>\n {children}\n </div>\n </AccordionGroupContext.Provider>\n );\n}\n\n/**\n * Properties for the LlmAccordionItem component.\n */\nexport interface LlmAccordionItemProps\n extends HTMLAttributes<HTMLDivElement>,\n LlmAccordionItemSpec {\n /**\n * Whether the item is currently expanded.\n */\n expanded?: boolean;\n /**\n * Callback triggered when the expanded state changes.\n */\n onExpandedChange?: (expanded: boolean) => void;\n /**\n * Whether the accordion item is disabled.\n */\n disabled?: boolean;\n /**\n * The content of the accordion item, typically including an LlmAccordionHeader.\n */\n children?: ReactNode;\n}\n\n/**\n * An individual item within an accordion group.\n */\nexport function LlmAccordionItem({\n expanded: externalExpanded,\n onExpandedChange,\n disabled = false,\n children,\n className,\n ...rest\n}: LlmAccordionItemProps) {\n const ctx = useContext(AccordionGroupContext);\n const id = useId();\n const triggerId = `${id}-trigger`;\n const panelId = `${id}-panel`;\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n const { registerItem, unregisterItem } = ctx;\n\n // Register/unregister with parent\n useLayoutEffect(() => {\n registerItem(id, triggerRef, disabled);\n return () => unregisterItem(id);\n }, [id, triggerRef, disabled, registerItem, unregisterItem]);\n\n const isControlled = externalExpanded !== undefined;\n const isExpanded = isControlled ? externalExpanded : ctx.openItems.has(id);\n\n const toggle = () => {\n if (disabled) return;\n const next = !isExpanded;\n if (!isControlled) ctx.toggleItem(id);\n onExpandedChange?.(next);\n };\n\n const classes = [\n 'llm-accordion-item',\n isExpanded && 'is-expanded',\n disabled && 'is-disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // Separate header child from body children\n const childArray = Array.isArray(children) ? children : [children];\n const headerNode = childArray.find(\n (c): c is React.ReactElement =>\n typeof c === 'object' &&\n c !== null &&\n 'type' in (c as object) &&\n (c as React.ReactElement).type === LlmAccordionHeader\n );\n const bodyNodes = childArray.filter((c) => c !== headerNode);\n\n return (\n <div className={classes} {...rest}>\n <h3 className=\"accordion-heading\">\n <button\n ref={triggerRef}\n type=\"button\"\n id={triggerId}\n className={['accordion-trigger', disabled && 'is-disabled']\n .filter(Boolean)\n .join(' ')}\n aria-expanded={isExpanded}\n aria-controls={panelId}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onClick={toggle}\n onKeyDown={(e) => ctx.handleKeydown(e, id)}\n >\n {headerNode}\n <svg\n className={['chevron', isExpanded && 'is-expanded']\n .filter(Boolean)\n .join(' ')}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </h3>\n <div\n className={['accordion-panel-wrapper', isExpanded && 'is-expanded']\n .filter(Boolean)\n .join(' ')}\n >\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={triggerId}\n className=\"accordion-panel\"\n >\n {bodyNodes}\n </div>\n </div>\n </div>\n );\n}\n\n/**\n * The header component for an LlmAccordionItem.\n */\nexport function LlmAccordionHeader({\n children,\n className,\n ...rest\n}: HTMLAttributes<HTMLSpanElement> & {\n /**\n * The content to be rendered in the header.\n */\n children?: ReactNode;\n}) {\n return (\n <span\n className={['accordion-header-content', className].filter(Boolean).join(' ')}\n {...rest}\n >\n {children}\n </span>\n );\n}\n"]}
@@ -0,0 +1,29 @@
1
+ import { HTMLAttributes, ReactNode } from 'react';
2
+ import type { LlmAlertSpec } from '@atelier-ui/spec';
3
+ import './llm-alert.css';
4
+ /**
5
+ * Properties for the LlmAlert component.
6
+ */
7
+ export interface LlmAlertProps extends HTMLAttributes<HTMLDivElement>, LlmAlertSpec {
8
+ /**
9
+ * The visual style variant of the alert.
10
+ */
11
+ variant?: 'info' | 'success' | 'warning' | 'danger';
12
+ /**
13
+ * Whether the alert can be dismissed by the user.
14
+ */
15
+ dismissible?: boolean;
16
+ /**
17
+ * Callback triggered when the alert is dismissed.
18
+ */
19
+ onDismissed?: () => void;
20
+ /**
21
+ * The content to be rendered inside the alert.
22
+ */
23
+ children?: ReactNode;
24
+ }
25
+ /**
26
+ * An alert component for displaying important messages.
27
+ */
28
+ export declare function LlmAlert({ variant, dismissible, onDismissed, children, className, ...rest }: LlmAlertProps): import("react/jsx-runtime").JSX.Element;
29
+ //# sourceMappingURL=llm-alert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-alert.d.ts","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/alert/llm-alert.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,iBAAiB,CAAC;AAEzB;;GAEG;AACH,MAAM,WAAW,aACf,SAAQ,cAAc,CAAC,cAAc,CAAC,EACpC,YAAY;IACd;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACpD;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EACvB,OAAgB,EAChB,WAAmB,EACnB,WAAW,EACX,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,EAAE,aAAa,2CAiCf"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import './llm-alert.css';
3
+ /**
4
+ * An alert component for displaying important messages.
5
+ */
6
+ export function LlmAlert({ variant = 'info', dismissible = false, onDismissed, children, className, ...rest }) {
7
+ const classes = ['llm-alert', `variant-${variant}`, className].filter(Boolean).join(' ');
8
+ const ariaLive = variant === 'danger' || variant === 'warning' ? 'assertive' : 'polite';
9
+ return (_jsxs("div", { className: classes, role: "alert", "aria-live": ariaLive, ...rest, children: [_jsx("span", { className: "content", children: children }), dismissible && (_jsx("button", { className: "dismiss", type: "button", "aria-label": "Dismiss", onClick: onDismissed, children: _jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), _jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })] }) }))] }));
10
+ }
11
+ //# sourceMappingURL=llm-alert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-alert.js","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/alert/llm-alert.tsx"],"names":[],"mappings":";AAEA,OAAO,iBAAiB,CAAC;AA0BzB;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,EACvB,OAAO,GAAG,MAAM,EAChB,WAAW,GAAG,KAAK,EACnB,WAAW,EACX,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACO;IACd,MAAM,OAAO,GAAG,CAAC,WAAW,EAAE,WAAW,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzF,MAAM,QAAQ,GAAG,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;IAExF,OAAO,CACL,eAAK,SAAS,EAAE,OAAO,EAAE,IAAI,EAAC,OAAO,eAAY,QAAQ,KAAM,IAAI,aACjE,eAAM,SAAS,EAAC,SAAS,YAAE,QAAQ,GAAQ,EAC1C,WAAW,IAAI,CACd,iBACE,SAAS,EAAC,SAAS,EACnB,IAAI,EAAC,QAAQ,gBACF,SAAS,EACpB,OAAO,EAAE,WAAW,YAEpB,eACE,KAAK,EAAC,4BAA4B,EAClC,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,iBACV,MAAM,aAElB,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,GAAG,EACtC,eAAM,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,IAClC,GACC,CACV,IACG,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { HTMLAttributes, ReactNode } from 'react';\nimport type { LlmAlertSpec } from '@atelier-ui/spec';\nimport './llm-alert.css';\n\n/**\n * Properties for the LlmAlert component.\n */\nexport interface LlmAlertProps\n extends HTMLAttributes<HTMLDivElement>,\n LlmAlertSpec {\n /**\n * The visual style variant of the alert.\n */\n variant?: 'info' | 'success' | 'warning' | 'danger';\n /**\n * Whether the alert can be dismissed by the user.\n */\n dismissible?: boolean;\n /**\n * Callback triggered when the alert is dismissed.\n */\n onDismissed?: () => void;\n /**\n * The content to be rendered inside the alert.\n */\n children?: ReactNode;\n}\n\n/**\n * An alert component for displaying important messages.\n */\nexport function LlmAlert({\n variant = 'info',\n dismissible = false,\n onDismissed,\n children,\n className,\n ...rest\n}: LlmAlertProps) {\n const classes = ['llm-alert', `variant-${variant}`, className].filter(Boolean).join(' ');\n const ariaLive = variant === 'danger' || variant === 'warning' ? 'assertive' : 'polite';\n\n return (\n <div className={classes} role=\"alert\" aria-live={ariaLive} {...rest}>\n <span className=\"content\">{children}</span>\n {dismissible && (\n <button\n className=\"dismiss\"\n type=\"button\"\n aria-label=\"Dismiss\"\n onClick={onDismissed}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n )}\n </div>\n );\n}\n"]}
@@ -0,0 +1,58 @@
1
+ import { HTMLAttributes, ReactNode } from 'react';
2
+ import type { LlmAvatarSpec, LlmAvatarGroupSpec } from '@atelier-ui/spec';
3
+ import './llm-avatar.css';
4
+ /**
5
+ * Properties for the LlmAvatar component.
6
+ */
7
+ export interface LlmAvatarProps extends HTMLAttributes<HTMLDivElement>, LlmAvatarSpec {
8
+ /**
9
+ * The URL of the image to display.
10
+ */
11
+ src?: string;
12
+ /**
13
+ * Accessible text for the avatar image.
14
+ */
15
+ alt?: string;
16
+ /**
17
+ * The name of the person/entity, used for initials if no image is provided.
18
+ */
19
+ name?: string;
20
+ /**
21
+ * The size of the avatar.
22
+ */
23
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
24
+ /**
25
+ * The shape of the avatar.
26
+ */
27
+ shape?: 'circle' | 'square';
28
+ /**
29
+ * The status indicator to display on the avatar.
30
+ */
31
+ status?: 'online' | 'offline' | 'away' | 'busy' | '';
32
+ }
33
+ /**
34
+ * An avatar component for displaying user profile pictures or initials.
35
+ */
36
+ export declare function LlmAvatar({ src, alt, name, size, shape, status, className, ...rest }: LlmAvatarProps): import("react/jsx-runtime").JSX.Element;
37
+ /**
38
+ * Properties for the LlmAvatarGroup component.
39
+ */
40
+ export interface LlmAvatarGroupProps extends HTMLAttributes<HTMLDivElement>, LlmAvatarGroupSpec {
41
+ /**
42
+ * The maximum number of avatars to show before displaying an overflow badge.
43
+ */
44
+ max?: number;
45
+ /**
46
+ * The size of the avatars in the group.
47
+ */
48
+ size?: LlmAvatarProps['size'];
49
+ /**
50
+ * The avatars to be rendered in the group.
51
+ */
52
+ children?: ReactNode;
53
+ }
54
+ /**
55
+ * A container for grouping multiple avatars.
56
+ */
57
+ export declare function LlmAvatarGroup({ max, size, children, className, ...rest }: LlmAvatarGroupProps): import("react/jsx-runtime").JSX.Element;
58
+ //# sourceMappingURL=llm-avatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-avatar.d.ts","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/avatar/llm-avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAiC,MAAM,OAAO,CAAC;AACjF,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,kBAAkB,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,cACf,SAAQ,cAAc,CAAC,cAAc,CAAC,EACpC,aAAa;IACf;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACxC;;OAEG;IACH,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B;;OAEG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC;CACtD;AAWD;;GAEG;AACH,wBAAgB,SAAS,CAAC,EACxB,GAAQ,EACR,GAAQ,EACR,IAAS,EACT,IAAW,EACX,KAAgB,EAChB,MAAW,EACX,SAAS,EACT,GAAG,IAAI,EACR,EAAE,cAAc,2CA8BhB;AAED;;GAEG;AACH,MAAM,WAAW,mBACf,SAAQ,cAAc,CAAC,cAAc,CAAC,EACpC,kBAAkB;IACpB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,IAAI,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC9B;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAC7B,GAAO,EACP,IAAW,EACX,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,EAAE,mBAAmB,2CAoBrB"}
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Children, useState } from 'react';
3
+ import './llm-avatar.css';
4
+ function getInitials(name) {
5
+ return name
6
+ .split(' ')
7
+ .filter(Boolean)
8
+ .slice(0, 2)
9
+ .map((w) => w[0].toUpperCase())
10
+ .join('');
11
+ }
12
+ /**
13
+ * An avatar component for displaying user profile pictures or initials.
14
+ */
15
+ export function LlmAvatar({ src = '', alt = '', name = '', size = 'md', shape = 'circle', status = '', className, ...rest }) {
16
+ const [imgError, setImgError] = useState(false);
17
+ const [prevSrc, setPrevSrc] = useState(src);
18
+ // Reset imgError when src changes
19
+ if (src !== prevSrc) {
20
+ setPrevSrc(src);
21
+ setImgError(false);
22
+ }
23
+ const classes = ['llm-avatar', `size-${size}`, `shape-${shape}`, className]
24
+ .filter(Boolean).join(' ');
25
+ const initials = name ? getInitials(name) : '';
26
+ const ariaLabel = alt || name || 'Avatar';
27
+ return (_jsxs("div", { className: classes, "aria-label": ariaLabel, role: "img", ...rest, children: [src && !imgError ? (_jsx("img", { src: src, alt: alt || name, onError: () => setImgError(true) })) : initials ? (_jsx("span", { className: "initials", "aria-hidden": "true", children: initials })) : (_jsx("svg", { className: "icon", "aria-hidden": "true", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M12 12c2.761 0 5-2.239 5-5s-2.239-5-5-5-5 2.239-5 5 2.239 5 5 5zm0 2c-3.314 0-10 1.343-10 4v2h20v-2c0-2.657-6.686-4-10-4z" }) })), status && _jsx("span", { className: `status-dot status-${status}`, "aria-hidden": "true" })] }));
28
+ }
29
+ /**
30
+ * A container for grouping multiple avatars.
31
+ */
32
+ export function LlmAvatarGroup({ max = 5, size = 'md', children, className, ...rest }) {
33
+ const childArray = Children.toArray(children);
34
+ const visible = childArray.slice(0, max);
35
+ const overflow = childArray.length - max;
36
+ const classes = ['llm-avatar-group', `size-${size}`, className].filter(Boolean).join(' ');
37
+ return (_jsxs("div", { className: classes, ...rest, children: [visible, overflow > 0 && (_jsxs("div", { className: `overflow-badge size-${size}`, "aria-label": `+${overflow} more`, children: ["+", overflow] }))] }));
38
+ }
39
+ //# sourceMappingURL=llm-avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-avatar.js","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/avatar/llm-avatar.tsx"],"names":[],"mappings":"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","sourcesContent":["import { HTMLAttributes, ReactNode, Children, useState, useEffect } from 'react';\nimport type {\n LlmAvatarSpec,\n LlmAvatarGroupSpec,\n} from '@atelier-ui/spec';\nimport './llm-avatar.css';\n\n/**\n * Properties for the LlmAvatar component.\n */\nexport interface LlmAvatarProps\n extends HTMLAttributes<HTMLDivElement>,\n LlmAvatarSpec {\n /**\n * The URL of the image to display.\n */\n src?: string;\n /**\n * Accessible text for the avatar image.\n */\n alt?: string;\n /**\n * The name of the person/entity, used for initials if no image is provided.\n */\n name?: string;\n /**\n * The size of the avatar.\n */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /**\n * The shape of the avatar.\n */\n shape?: 'circle' | 'square';\n /**\n * The status indicator to display on the avatar.\n */\n status?: 'online' | 'offline' | 'away' | 'busy' | '';\n}\n\nfunction getInitials(name: string): string {\n return name\n .split(' ')\n .filter(Boolean)\n .slice(0, 2)\n .map((w) => w[0].toUpperCase())\n .join('');\n}\n\n/**\n * An avatar component for displaying user profile pictures or initials.\n */\nexport function LlmAvatar({\n src = '',\n alt = '',\n name = '',\n size = 'md',\n shape = 'circle',\n status = '',\n className,\n ...rest\n}: LlmAvatarProps) {\n const [imgError, setImgError] = useState(false);\n const [prevSrc, setPrevSrc] = useState(src);\n\n // Reset imgError when src changes\n if (src !== prevSrc) {\n setPrevSrc(src);\n setImgError(false);\n }\n\n const classes = ['llm-avatar', `size-${size}`, `shape-${shape}`, className]\n .filter(Boolean).join(' ');\n\n const initials = name ? getInitials(name) : '';\n const ariaLabel = alt || name || 'Avatar';\n\n return (\n <div className={classes} aria-label={ariaLabel} role=\"img\" {...rest}>\n {src && !imgError ? (\n <img src={src} alt={alt || name} onError={() => setImgError(true)} />\n ) : initials ? (\n <span className=\"initials\" aria-hidden=\"true\">{initials}</span>\n ) : (\n <svg className=\"icon\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 12c2.761 0 5-2.239 5-5s-2.239-5-5-5-5 2.239-5 5 2.239 5 5 5zm0 2c-3.314 0-10 1.343-10 4v2h20v-2c0-2.657-6.686-4-10-4z\" />\n </svg>\n )}\n {status && <span className={`status-dot status-${status}`} aria-hidden=\"true\" />}\n </div>\n );\n}\n\n/**\n * Properties for the LlmAvatarGroup component.\n */\nexport interface LlmAvatarGroupProps\n extends HTMLAttributes<HTMLDivElement>,\n LlmAvatarGroupSpec {\n /**\n * The maximum number of avatars to show before displaying an overflow badge.\n */\n max?: number;\n /**\n * The size of the avatars in the group.\n */\n size?: LlmAvatarProps['size'];\n /**\n * The avatars to be rendered in the group.\n */\n children?: ReactNode;\n}\n\n/**\n * A container for grouping multiple avatars.\n */\nexport function LlmAvatarGroup({\n max = 5,\n size = 'md',\n children,\n className,\n ...rest\n}: LlmAvatarGroupProps) {\n const childArray = Children.toArray(children);\n const visible = childArray.slice(0, max);\n const overflow = childArray.length - max;\n\n const classes = ['llm-avatar-group', `size-${size}`, className].filter(Boolean).join(' ');\n\n return (\n <div className={classes} {...rest}>\n {visible}\n {overflow > 0 && (\n <div\n className={`overflow-badge size-${size}`}\n aria-label={`+${overflow} more`}\n >\n +{overflow}\n </div>\n )}\n </div>\n );\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import { HTMLAttributes, ReactNode } from 'react';
2
+ import type { LlmBadgeSpec } from '@atelier-ui/spec';
3
+ import './llm-badge.css';
4
+ /**
5
+ * Properties for the LlmBadge component.
6
+ */
7
+ export interface LlmBadgeProps extends HTMLAttributes<HTMLSpanElement>, LlmBadgeSpec {
8
+ /**
9
+ * The visual style variant of the badge.
10
+ */
11
+ variant?: 'default' | 'success' | 'warning' | 'danger' | 'info';
12
+ /**
13
+ * The size of the badge.
14
+ */
15
+ size?: 'sm' | 'md';
16
+ /**
17
+ * The content to be rendered inside the badge.
18
+ */
19
+ children?: ReactNode;
20
+ }
21
+ /**
22
+ * A badge component for displaying small amounts of information or status.
23
+ */
24
+ export declare function LlmBadge({ variant, size, children, className, ...rest }: LlmBadgeProps): import("react/jsx-runtime").JSX.Element;
25
+ //# sourceMappingURL=llm-badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-badge.d.ts","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/badge/llm-badge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,iBAAiB,CAAC;AAEzB;;GAEG;AACH,MAAM,WAAW,aACf,SAAQ,cAAc,CAAC,eAAe,CAAC,EACrC,YAAY;IACd;;OAEG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAChE;;OAEG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EACvB,OAAmB,EACnB,IAAW,EACX,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,EAAE,aAAa,2CAQf"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import './llm-badge.css';
3
+ /**
4
+ * A badge component for displaying small amounts of information or status.
5
+ */
6
+ export function LlmBadge({ variant = 'default', size = 'md', children, className, ...rest }) {
7
+ const classes = ['llm-badge', `variant-${variant}`, `size-${size}`, className]
8
+ .filter(Boolean).join(' ');
9
+ return (_jsx("span", { className: classes, role: "status", ...rest, children: children }));
10
+ }
11
+ //# sourceMappingURL=llm-badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-badge.js","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/badge/llm-badge.tsx"],"names":[],"mappings":";AAEA,OAAO,iBAAiB,CAAC;AAsBzB;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,EACvB,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,IAAI,EACX,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACO;IACd,MAAM,OAAO,GAAG,CAAC,WAAW,EAAE,WAAW,OAAO,EAAE,EAAE,QAAQ,IAAI,EAAE,EAAE,SAAS,CAAC;SAC3E,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,CACL,eAAM,SAAS,EAAE,OAAO,EAAE,IAAI,EAAC,QAAQ,KAAK,IAAI,YAC7C,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC","sourcesContent":["import { HTMLAttributes, ReactNode } from 'react';\nimport type { LlmBadgeSpec } from '@atelier-ui/spec';\nimport './llm-badge.css';\n\n/**\n * Properties for the LlmBadge component.\n */\nexport interface LlmBadgeProps\n extends HTMLAttributes<HTMLSpanElement>,\n LlmBadgeSpec {\n /**\n * The visual style variant of the badge.\n */\n variant?: 'default' | 'success' | 'warning' | 'danger' | 'info';\n /**\n * The size of the badge.\n */\n size?: 'sm' | 'md';\n /**\n * The content to be rendered inside the badge.\n */\n children?: ReactNode;\n}\n\n/**\n * A badge component for displaying small amounts of information or status.\n */\nexport function LlmBadge({\n variant = 'default',\n size = 'md',\n children,\n className,\n ...rest\n}: LlmBadgeProps) {\n const classes = ['llm-badge', `variant-${variant}`, `size-${size}`, className]\n .filter(Boolean).join(' ');\n return (\n <span className={classes} role=\"status\" {...rest}>\n {children}\n </span>\n );\n}\n"]}
@@ -0,0 +1,38 @@
1
+ import { HTMLAttributes, ReactNode, AnchorHTMLAttributes } from 'react';
2
+ import type { LlmBreadcrumbItemSpec } from '@atelier-ui/spec';
3
+ import './llm-breadcrumbs.css';
4
+ /**
5
+ * Properties for the LlmBreadcrumbs component.
6
+ */
7
+ export interface LlmBreadcrumbsProps extends HTMLAttributes<HTMLElement> {
8
+ /**
9
+ * The breadcrumb items to be rendered.
10
+ */
11
+ children?: ReactNode;
12
+ }
13
+ /**
14
+ * A breadcrumbs component for displaying a navigation trail.
15
+ */
16
+ export declare function LlmBreadcrumbs({ children, className, ...rest }: LlmBreadcrumbsProps): import("react/jsx-runtime").JSX.Element;
17
+ /**
18
+ * Properties for the LlmBreadcrumbItem component.
19
+ */
20
+ export interface LlmBreadcrumbItemProps extends AnchorHTMLAttributes<HTMLAnchorElement>, LlmBreadcrumbItemSpec {
21
+ /**
22
+ * The URL the breadcrumb points to.
23
+ */
24
+ href?: string;
25
+ /**
26
+ * Whether this is the current page.
27
+ */
28
+ current?: boolean;
29
+ /**
30
+ * The content to be rendered inside the breadcrumb item.
31
+ */
32
+ children?: ReactNode;
33
+ }
34
+ /**
35
+ * An individual breadcrumb item.
36
+ */
37
+ export declare function LlmBreadcrumbItem({ href, current, children, className, ...rest }: LlmBreadcrumbItemProps): import("react/jsx-runtime").JSX.Element;
38
+ //# sourceMappingURL=llm-breadcrumbs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-breadcrumbs.d.ts","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/breadcrumbs/llm-breadcrumbs.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,oBAAoB,EAA0C,MAAM,OAAO,CAAC;AAChH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,uBAAuB,CAAC;AAE/B;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,cAAc,CAAC,WAAW,CAAC;IACtE;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,mBAAmB,2CAmBnF;AAED;;GAEG;AACH,MAAM,WAAW,sBACf,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC,EAC7C,qBAAqB;IACvB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,OAAe,EACf,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,EAAE,sBAAsB,2CAqBxB"}
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Children, isValidElement, cloneElement } from 'react';
3
+ import './llm-breadcrumbs.css';
4
+ /**
5
+ * A breadcrumbs component for displaying a navigation trail.
6
+ */
7
+ export function LlmBreadcrumbs({ children, className, ...rest }) {
8
+ const classes = ['llm-breadcrumbs', className].filter(Boolean).join(' ');
9
+ // Automatically mark the last child as current
10
+ const childArray = Children.toArray(children);
11
+ const enhancedChildren = childArray.map((child, index) => {
12
+ if (isValidElement(child) && index === childArray.length - 1) {
13
+ return cloneElement(child, { current: true });
14
+ }
15
+ return child;
16
+ });
17
+ return (_jsx("nav", { className: classes, "aria-label": "Breadcrumb", ...rest, children: _jsx("ol", { className: "breadcrumbs-list", children: enhancedChildren }) }));
18
+ }
19
+ /**
20
+ * An individual breadcrumb item.
21
+ */
22
+ export function LlmBreadcrumbItem({ href, current = false, children, className, ...rest }) {
23
+ const classes = ['llm-breadcrumb-item', current && 'is-current', className]
24
+ .filter(Boolean)
25
+ .join(' ');
26
+ return (_jsx("li", { className: classes, children: href && !current ? (_jsx("a", { href: href, className: "breadcrumb-link", ...rest, children: children })) : (_jsx("span", { className: "breadcrumb-current", "aria-current": current ? 'page' : undefined, children: children })) }));
27
+ }
28
+ //# sourceMappingURL=llm-breadcrumbs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-breadcrumbs.js","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/breadcrumbs/llm-breadcrumbs.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAmD,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAEhH,OAAO,uBAAuB,CAAC;AAY/B;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAuB;IAClF,MAAM,OAAO,GAAG,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEzE,+CAA+C;IAC/C,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,gBAAgB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACvD,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7D,OAAO,YAAY,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAY,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,cAAK,SAAS,EAAE,OAAO,gBAAa,YAAY,KAAK,IAAI,YACvD,aAAI,SAAS,EAAC,kBAAkB,YAC7B,gBAAgB,GACd,GACD,CACP,CAAC;AACJ,CAAC;AAsBD;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAChC,IAAI,EACJ,OAAO,GAAG,KAAK,EACf,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACgB;IACvB,MAAM,OAAO,GAAG,CAAC,qBAAqB,EAAE,OAAO,IAAI,YAAY,EAAE,SAAS,CAAC;SACxE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,OAAO,CACL,aAAI,SAAS,EAAE,OAAO,YACnB,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAClB,YAAG,IAAI,EAAE,IAAI,EAAE,SAAS,EAAC,iBAAiB,KAAK,IAAI,YAChD,QAAQ,GACP,CACL,CAAC,CAAC,CAAC,CACF,eACE,SAAS,EAAC,oBAAoB,kBAChB,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,YAEzC,QAAQ,GACJ,CACR,GACE,CACN,CAAC;AACJ,CAAC","sourcesContent":["import { HTMLAttributes, ReactNode, AnchorHTMLAttributes, Children, isValidElement, cloneElement } from 'react';\nimport type { LlmBreadcrumbItemSpec } from '@atelier-ui/spec';\nimport './llm-breadcrumbs.css';\n\n/**\n * Properties for the LlmBreadcrumbs component.\n */\nexport interface LlmBreadcrumbsProps extends HTMLAttributes<HTMLElement> {\n /**\n * The breadcrumb items to be rendered.\n */\n children?: ReactNode;\n}\n\n/**\n * A breadcrumbs component for displaying a navigation trail.\n */\nexport function LlmBreadcrumbs({ children, className, ...rest }: LlmBreadcrumbsProps) {\n const classes = ['llm-breadcrumbs', className].filter(Boolean).join(' ');\n\n // Automatically mark the last child as current\n const childArray = Children.toArray(children);\n const enhancedChildren = childArray.map((child, index) => {\n if (isValidElement(child) && index === childArray.length - 1) {\n return cloneElement(child, { current: true } as object);\n }\n return child;\n });\n\n return (\n <nav className={classes} aria-label=\"Breadcrumb\" {...rest}>\n <ol className=\"breadcrumbs-list\">\n {enhancedChildren}\n </ol>\n </nav>\n );\n}\n\n/**\n * Properties for the LlmBreadcrumbItem component.\n */\nexport interface LlmBreadcrumbItemProps\n extends AnchorHTMLAttributes<HTMLAnchorElement>,\n LlmBreadcrumbItemSpec {\n /**\n * The URL the breadcrumb points to.\n */\n href?: string;\n /**\n * Whether this is the current page.\n */\n current?: boolean;\n /**\n * The content to be rendered inside the breadcrumb item.\n */\n children?: ReactNode;\n}\n\n/**\n * An individual breadcrumb item.\n */\nexport function LlmBreadcrumbItem({\n href,\n current = false,\n children,\n className,\n ...rest\n}: LlmBreadcrumbItemProps) {\n const classes = ['llm-breadcrumb-item', current && 'is-current', className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <li className={classes}>\n {href && !current ? (\n <a href={href} className=\"breadcrumb-link\" {...rest}>\n {children}\n </a>\n ) : (\n <span\n className=\"breadcrumb-current\"\n aria-current={current ? 'page' : undefined}\n >\n {children}\n </span>\n )}\n </li>\n );\n}\n"]}