@cratis/components 1.8.2 → 1.9.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 (60) hide show
  1. package/dist/cjs/CommandDialog/CommandStepper.js +6 -0
  2. package/dist/cjs/CommandDialog/CommandStepper.js.map +1 -1
  3. package/dist/cjs/Toolbar/Toolbar.css +105 -2
  4. package/dist/cjs/Toolbar/ToolbarButton.js +10 -3
  5. package/dist/cjs/Toolbar/ToolbarButton.js.map +1 -1
  6. package/dist/cjs/Toolbar/ToolbarContext.js.map +1 -1
  7. package/dist/cjs/Toolbar/ToolbarFolder.js +12 -7
  8. package/dist/cjs/Toolbar/ToolbarFolder.js.map +1 -1
  9. package/dist/cjs/Toolbar/ToolbarFolderContext.js +20 -0
  10. package/dist/cjs/Toolbar/ToolbarFolderContext.js.map +1 -0
  11. package/dist/cjs/Toolbar/ToolbarGroup.js +102 -0
  12. package/dist/cjs/Toolbar/ToolbarGroup.js.map +1 -0
  13. package/dist/cjs/Toolbar/ToolbarSection.js +44 -5
  14. package/dist/cjs/Toolbar/ToolbarSection.js.map +1 -1
  15. package/dist/cjs/Toolbar/ToolbarSlot.js +125 -0
  16. package/dist/cjs/Toolbar/ToolbarSlot.js.map +1 -0
  17. package/dist/cjs/Toolbar/index.js +6 -0
  18. package/dist/cjs/Toolbar/index.js.map +1 -1
  19. package/dist/cjs/tailwind-utilities.css +12 -0
  20. package/dist/esm/CommandDialog/CommandStepper.d.ts.map +1 -1
  21. package/dist/esm/CommandDialog/CommandStepper.js +6 -0
  22. package/dist/esm/CommandDialog/CommandStepper.js.map +1 -1
  23. package/dist/esm/Toolbar/Toolbar.css +105 -2
  24. package/dist/esm/Toolbar/Toolbar.stories.d.ts +6 -1
  25. package/dist/esm/Toolbar/Toolbar.stories.d.ts.map +1 -1
  26. package/dist/esm/Toolbar/Toolbar.stories.js +69 -16
  27. package/dist/esm/Toolbar/Toolbar.stories.js.map +1 -1
  28. package/dist/esm/Toolbar/ToolbarButton.d.ts +2 -2
  29. package/dist/esm/Toolbar/ToolbarButton.d.ts.map +1 -1
  30. package/dist/esm/Toolbar/ToolbarButton.js +11 -4
  31. package/dist/esm/Toolbar/ToolbarButton.js.map +1 -1
  32. package/dist/esm/Toolbar/ToolbarContext.d.ts +1 -0
  33. package/dist/esm/Toolbar/ToolbarContext.d.ts.map +1 -1
  34. package/dist/esm/Toolbar/ToolbarContext.js.map +1 -1
  35. package/dist/esm/Toolbar/ToolbarFolder.d.ts +4 -2
  36. package/dist/esm/Toolbar/ToolbarFolder.d.ts.map +1 -1
  37. package/dist/esm/Toolbar/ToolbarFolder.js +13 -8
  38. package/dist/esm/Toolbar/ToolbarFolder.js.map +1 -1
  39. package/dist/esm/Toolbar/ToolbarFolderContext.d.ts +4 -0
  40. package/dist/esm/Toolbar/ToolbarFolderContext.d.ts.map +1 -0
  41. package/dist/esm/Toolbar/ToolbarFolderContext.js +17 -0
  42. package/dist/esm/Toolbar/ToolbarFolderContext.js.map +1 -0
  43. package/dist/esm/Toolbar/ToolbarGroup.d.ts +8 -0
  44. package/dist/esm/Toolbar/ToolbarGroup.d.ts.map +1 -0
  45. package/dist/esm/Toolbar/ToolbarGroup.js +100 -0
  46. package/dist/esm/Toolbar/ToolbarGroup.js.map +1 -0
  47. package/dist/esm/Toolbar/ToolbarSection.d.ts.map +1 -1
  48. package/dist/esm/Toolbar/ToolbarSection.js +45 -6
  49. package/dist/esm/Toolbar/ToolbarSection.js.map +1 -1
  50. package/dist/esm/Toolbar/ToolbarSlot.d.ts +13 -0
  51. package/dist/esm/Toolbar/ToolbarSlot.d.ts.map +1 -0
  52. package/dist/esm/Toolbar/ToolbarSlot.js +121 -0
  53. package/dist/esm/Toolbar/ToolbarSlot.js.map +1 -0
  54. package/dist/esm/Toolbar/index.d.ts +5 -0
  55. package/dist/esm/Toolbar/index.d.ts.map +1 -1
  56. package/dist/esm/Toolbar/index.js +2 -0
  57. package/dist/esm/Toolbar/index.js.map +1 -1
  58. package/dist/esm/tailwind-utilities.css +12 -0
  59. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  60. package/package.json +2 -2
@@ -0,0 +1,121 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { createContext, useId, useContext, useLayoutEffect, useEffect, useState, useCallback, useSyncExternalStore } from 'react';
3
+
4
+ /** Stable empty snapshot returned when a slot name has no registered content. */
5
+ const _emptySnapshot = [];
6
+ /**
7
+ * Registry for named toolbar slot entries.
8
+ * Maintained outside React state so slot registrations never re-render the provider.
9
+ */
10
+ class ToolbarSlotRegistry {
11
+ _slots = new Map();
12
+ _snapshots = new Map();
13
+ _subscribers = new Set();
14
+ /**
15
+ * Register or update a slot entry.
16
+ * Notifies subscribers only when the content reference or order actually changes.
17
+ */
18
+ register(slotName, id, content, order) {
19
+ if (!this._slots.has(slotName)) {
20
+ this._slots.set(slotName, new Map());
21
+ }
22
+ const slotMap = this._slots.get(slotName);
23
+ const previous = slotMap.get(id);
24
+ if (previous?.content === content && previous?.order === order)
25
+ return;
26
+ slotMap.set(id, { content, order });
27
+ this._recompute(slotName);
28
+ this._notify();
29
+ }
30
+ /** Remove a slot entry and notify subscribers. */
31
+ unregister(slotName, id) {
32
+ const slotMap = this._slots.get(slotName);
33
+ if (!slotMap?.has(id))
34
+ return;
35
+ slotMap.delete(id);
36
+ this._recompute(slotName);
37
+ this._notify();
38
+ }
39
+ /** Subscribe to any slot change. Returns an unsubscribe function. */
40
+ subscribe(fn) {
41
+ this._subscribers.add(fn);
42
+ return () => this._subscribers.delete(fn);
43
+ }
44
+ /**
45
+ * Returns a stable snapshot of sorted slot contents for the given slot name.
46
+ * The reference only changes when the slot set actually changes.
47
+ */
48
+ getSnapshot(slotName) {
49
+ return this._snapshots.get(slotName) ?? _emptySnapshot;
50
+ }
51
+ _recompute(slotName) {
52
+ const slotMap = this._slots.get(slotName);
53
+ if (!slotMap || slotMap.size === 0) {
54
+ this._snapshots.delete(slotName);
55
+ return;
56
+ }
57
+ this._snapshots.set(slotName, [...slotMap.values()]
58
+ .sort((a, b) => a.order - b.order)
59
+ .map(entry => entry.content));
60
+ }
61
+ _notify() {
62
+ this._subscribers.forEach(fn => fn());
63
+ }
64
+ }
65
+ const ToolbarSlotContext = createContext(null);
66
+ /**
67
+ * Provides the toolbar slot registry to the component tree.
68
+ *
69
+ * Mount once above both the toolbar and the components that fill slots.
70
+ * Each provider creates an isolated registry — nesting providers creates isolated scopes.
71
+ */
72
+ const ToolbarSlotProvider = ({ children }) => {
73
+ const [registry] = useState(() => new ToolbarSlotRegistry());
74
+ return jsx(ToolbarSlotContext.Provider, { value: registry, children: children });
75
+ };
76
+ /**
77
+ * Returns the sorted slot contents for a given `slotName` as a stable array.
78
+ * Returns an empty array when no {@link ToolbarSlotProvider} is present or when the slot has no content.
79
+ *
80
+ * Suitable for direct use inside components that host a slot (e.g. {@link ToolbarGroup}).
81
+ */
82
+ const useToolbarSlot = (slotName) => {
83
+ const registry = useContext(ToolbarSlotContext);
84
+ const subscribe = useCallback((fn) => {
85
+ if (!registry)
86
+ return () => { };
87
+ return registry.subscribe(fn);
88
+ }, [registry]);
89
+ const getSnapshot = useCallback(() => registry?.getSnapshot(slotName) ?? _emptySnapshot, [registry, slotName]);
90
+ return useSyncExternalStore(subscribe, getSnapshot);
91
+ };
92
+ /**
93
+ * Teleports its children into the named toolbar slot without prop drilling.
94
+ * Renders nothing itself — place it anywhere inside a {@link ToolbarSlotProvider} tree.
95
+ *
96
+ * The nearest {@link ToolbarGroup} or {@link ToolbarContext} with a matching `slotName`
97
+ * will render the content. Use {@link ToolbarSlotProps.order} to control position relative to
98
+ * other {@link ToolbarSlot} entries in the same slot.
99
+ *
100
+ * @example
101
+ * ```tsx
102
+ * // In a feature component, inject a button into the 'canvas-tools' slot:
103
+ * <ToolbarSlot slotName="canvas-tools" order={10}>
104
+ * <ToolbarButton icon="pi pi-star" title="Favorite" />
105
+ * </ToolbarSlot>
106
+ * ```
107
+ */
108
+ const ToolbarSlot = ({ slotName, order = 0, children }) => {
109
+ const id = useId();
110
+ const registry = useContext(ToolbarSlotContext);
111
+ // Re-register on every render so fresh closures are always captured.
112
+ // The registry skips notification when the content reference hasn't changed.
113
+ useLayoutEffect(() => {
114
+ registry?.register(slotName, id, children, order);
115
+ });
116
+ useEffect(() => () => registry?.unregister(slotName, id), [id, registry, slotName]);
117
+ return null;
118
+ };
119
+
120
+ export { ToolbarSlot, ToolbarSlotProvider, useToolbarSlot };
121
+ //# sourceMappingURL=ToolbarSlot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolbarSlot.js","sources":["../../../Toolbar/ToolbarSlot.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":"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"}
@@ -4,6 +4,8 @@ export { ToolbarButton } from './ToolbarButton';
4
4
  export type { ToolbarButtonProps } from './ToolbarButton';
5
5
  export { ToolbarContext } from './ToolbarContext';
6
6
  export type { ToolbarContextProps } from './ToolbarContext';
7
+ export { ToolbarGroup } from './ToolbarGroup';
8
+ export type { ToolbarGroupProps } from './ToolbarGroup';
7
9
  export { ToolbarSection } from './ToolbarSection';
8
10
  export type { ToolbarSectionProps } from './ToolbarSection';
9
11
  export { ToolbarSeparator } from './ToolbarSeparator';
@@ -12,4 +14,7 @@ export { ToolbarFanOutItem } from './ToolbarFanOutItem';
12
14
  export type { ToolbarFanOutItemProps } from './ToolbarFanOutItem';
13
15
  export { ToolbarFolder } from './ToolbarFolder';
14
16
  export type { ToolbarFolderProps } from './ToolbarFolder';
17
+ export type { ToolbarFolderMode } from './ToolbarFolderContext';
18
+ export { ToolbarSlot, ToolbarSlotProvider, useToolbarSlot } from './ToolbarSlot';
19
+ export type { ToolbarSlotProps, ToolbarSlotProviderProps } from './ToolbarSlot';
15
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../Toolbar/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../Toolbar/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACjF,YAAY,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC"}
@@ -1,10 +1,12 @@
1
1
  export { Toolbar } from './Toolbar.js';
2
2
  export { ToolbarButton } from './ToolbarButton.js';
3
3
  export { ToolbarContext } from './ToolbarContext.js';
4
+ export { ToolbarGroup } from './ToolbarGroup.js';
4
5
  export { ToolbarSection } from './ToolbarSection.js';
5
6
  export { ToolbarSeparator } from './ToolbarSeparator.js';
6
7
  export { ToolbarFanOutItem } from './ToolbarFanOutItem.js';
7
8
  export { ToolbarFolder } from './ToolbarFolder.js';
9
+ export { ToolbarSlot, ToolbarSlotProvider, useToolbarSlot } from './ToolbarSlot.js';
8
10
 
9
11
  // Copyright (c) Cratis. All rights reserved.
10
12
  // Licensed under the MIT license. See LICENSE file in the project root for full license information.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../Toolbar/index.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;AAAA;AACA"}
1
+ {"version":3,"file":"index.js","sources":["../../../Toolbar/index.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;AAAA;AACA"}
@@ -335,6 +335,9 @@
335
335
  .block {
336
336
  display: block;
337
337
  }
338
+ .contents {
339
+ display: contents;
340
+ }
338
341
  .flex {
339
342
  display: flex;
340
343
  }
@@ -371,6 +374,9 @@
371
374
  .flex-1 {
372
375
  flex: 1;
373
376
  }
377
+ .flex-shrink-0 {
378
+ flex-shrink: 0;
379
+ }
374
380
  .flex-grow {
375
381
  flex-grow: 1;
376
382
  }
@@ -409,6 +415,9 @@
409
415
  .justify-center {
410
416
  justify-content: center;
411
417
  }
418
+ .justify-start {
419
+ justify-content: flex-start;
420
+ }
412
421
  .gap-1 {
413
422
  gap: calc(var(--spacing) * 1);
414
423
  }
@@ -424,6 +433,9 @@
424
433
  .gap-6 {
425
434
  gap: calc(var(--spacing) * 6);
426
435
  }
436
+ .gap-8 {
437
+ gap: calc(var(--spacing) * 8);
438
+ }
427
439
  .space-y-2 {
428
440
  :where(& > :not(:last-child)) {
429
441
  --tw-space-y-reverse: 0;