@astrake/lumora-ui 0.2.1 → 0.7.2

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 (118) hide show
  1. package/CHANGELOG.md +230 -141
  2. package/README.md +23 -21
  3. package/dist/LuAccordion.vue_vue_type_script_setup_true_lang-CwG5Ml8t.js +5032 -0
  4. package/dist/{LuEmbeddedStatusBar.vue_vue_type_script_setup_true_lang-CIksvebU.js → LuEmbeddedStatusBar.vue_vue_type_script_setup_true_lang-D4rqklgo.js} +1 -1
  5. package/dist/LuOverlay.vue_vue_type_script_setup_true_lang-C5jhqCgy.js +221 -0
  6. package/dist/__mocks__/empty.d.ts +4 -0
  7. package/dist/components/LuAccordion.vue.d.ts +23 -0
  8. package/dist/components/LuBarChart.vue.d.ts +22 -0
  9. package/dist/components/LuBottomSheet.vue.d.ts +27 -0
  10. package/dist/components/LuCalendar.vue.d.ts +34 -0
  11. package/dist/components/LuCard.vue.d.ts +0 -3
  12. package/dist/components/LuCheckbox.vue.d.ts +19 -5
  13. package/dist/components/LuChip.vue.d.ts +35 -0
  14. package/dist/components/LuChipGroup.vue.d.ts +23 -0
  15. package/dist/components/LuCodeBlock.vue.d.ts +11 -14
  16. package/dist/components/LuCollapsible.vue.d.ts +7 -4
  17. package/dist/components/LuCommandPalette.vue.d.ts +25 -0
  18. package/dist/components/LuDataGrid.types.d.ts +39 -0
  19. package/dist/components/LuDataGrid.vue.d.ts +84 -0
  20. package/dist/components/LuDateRangePicker.vue.d.ts +29 -0
  21. package/dist/components/LuDoughnutChart.vue.d.ts +17 -0
  22. package/dist/components/LuDrawer.vue.d.ts +33 -0
  23. package/dist/components/LuFileUpload.vue.d.ts +38 -0
  24. package/dist/components/LuForm.vue.d.ts +2 -2
  25. package/dist/components/LuFormField.vue.d.ts +21 -0
  26. package/dist/components/LuFormWizard.types.d.ts +7 -0
  27. package/dist/components/LuFormWizard.vue.d.ts +33 -0
  28. package/dist/components/LuGaugeChart.vue.d.ts +16 -0
  29. package/dist/components/LuKanban.types.d.ts +24 -0
  30. package/dist/components/LuKanban.vue.d.ts +30 -0
  31. package/dist/components/LuLineChart.vue.d.ts +19 -0
  32. package/dist/components/LuList.vue.d.ts +18 -0
  33. package/dist/components/LuListDivider.vue.d.ts +5 -0
  34. package/dist/components/LuListItem.vue.d.ts +32 -0
  35. package/dist/components/LuListSubheader.vue.d.ts +16 -0
  36. package/dist/components/LuMediaGallery.vue.d.ts +25 -0
  37. package/dist/components/LuMenu.vue.d.ts +2 -2
  38. package/dist/components/LuModal.vue.d.ts +5 -5
  39. package/dist/components/LuPagination.vue.d.ts +2 -2
  40. package/dist/components/LuPlanner.types.d.ts +14 -0
  41. package/dist/components/LuPlanner.vue.d.ts +23 -0
  42. package/dist/components/LuPopover.vue.d.ts +24 -0
  43. package/dist/components/LuRadioGroup.types.d.ts +1 -0
  44. package/dist/components/LuRadioGroup.vue.d.ts +2 -2
  45. package/dist/components/LuRichTextEditor.vue.d.ts +27 -0
  46. package/dist/components/LuSelect.vue.d.ts +35 -2
  47. package/dist/components/{LuPageHeader.vue.d.ts → LuSparkline.vue.d.ts} +9 -5
  48. package/dist/components/LuSwitch.vue.d.ts +19 -5
  49. package/dist/components/LuTimeline.vue.d.ts +17 -0
  50. package/dist/components/LuTimelineItem.vue.d.ts +24 -0
  51. package/dist/components/LuToast.vue.d.ts +5 -0
  52. package/dist/components/LuTree.types.d.ts +9 -0
  53. package/dist/components/LuTree.vue.d.ts +25 -0
  54. package/dist/components/LuTreeNode.vue.d.ts +37 -0
  55. package/dist/components/__tests__/LuAccordion.test.d.ts +1 -0
  56. package/dist/components/__tests__/LuBarChart.test.d.ts +1 -0
  57. package/dist/components/__tests__/LuBottomSheet.test.d.ts +1 -0
  58. package/dist/components/__tests__/LuCalendar.test.d.ts +1 -0
  59. package/dist/components/__tests__/LuCheckbox.test.d.ts +1 -0
  60. package/dist/components/__tests__/LuChip.test.d.ts +1 -0
  61. package/dist/components/__tests__/LuCommandPalette.test.d.ts +1 -0
  62. package/dist/components/__tests__/LuDataGrid.test.d.ts +1 -0
  63. package/dist/components/__tests__/LuDateRangePicker.test.d.ts +1 -0
  64. package/dist/components/__tests__/LuDoughnutChart.test.d.ts +1 -0
  65. package/dist/components/__tests__/LuDrawer.test.d.ts +1 -0
  66. package/dist/components/__tests__/LuFileUpload.test.d.ts +1 -0
  67. package/dist/components/__tests__/LuFormWizard.test.d.ts +1 -0
  68. package/dist/components/__tests__/LuGaugeChart.test.d.ts +1 -0
  69. package/dist/components/__tests__/LuKanban.test.d.ts +1 -0
  70. package/dist/components/__tests__/LuLineChart.test.d.ts +1 -0
  71. package/dist/components/__tests__/LuList.test.d.ts +1 -0
  72. package/dist/components/__tests__/LuMediaGallery.test.d.ts +1 -0
  73. package/dist/components/__tests__/LuPlanner.test.d.ts +1 -0
  74. package/dist/components/__tests__/LuPopover.test.d.ts +1 -0
  75. package/dist/components/__tests__/LuRadio.test.d.ts +1 -0
  76. package/dist/components/__tests__/LuRichTextEditor.test.d.ts +1 -0
  77. package/dist/components/__tests__/LuSelect.test.d.ts +1 -0
  78. package/dist/components/__tests__/LuSparkline.test.d.ts +1 -0
  79. package/dist/components/__tests__/LuSwitch.test.d.ts +1 -0
  80. package/dist/components/__tests__/LuTimeline.test.d.ts +1 -0
  81. package/dist/components/__tests__/LuToast.test.d.ts +1 -0
  82. package/dist/components/__tests__/LuTree.test.d.ts +1 -0
  83. package/dist/components/_all.d.ts +3 -0
  84. package/dist/components/index.d.ts +42 -3
  85. package/dist/components/index.js +73 -44
  86. package/dist/composables/index.d.ts +3 -0
  87. package/dist/composables/index.js +34 -14
  88. package/dist/composables/lazyVChart.d.ts +10 -0
  89. package/dist/composables/useChartTheme.d.ts +65 -0
  90. package/dist/composables/useDataGrid.d.ts +52 -0
  91. package/dist/composables/useFloating.d.ts +12 -0
  92. package/dist/composables/useLuToast.d.ts +14 -0
  93. package/dist/composables/useShiki.d.ts +2 -0
  94. package/dist/context-CGS7Ou_x.js +36 -0
  95. package/dist/index.d.ts +5 -0
  96. package/dist/index.js +217 -81
  97. package/dist/layout/LuFill.vue.d.ts +0 -3
  98. package/dist/layout/LuFixed.vue.d.ts +0 -3
  99. package/dist/layout/LuGrid.vue.d.ts +0 -4
  100. package/dist/layout/LuStack.vue.d.ts +5 -3
  101. package/dist/layout/index.js +1 -1
  102. package/dist/shell/index.js +1 -1
  103. package/dist/skins/components.d.ts +2 -0
  104. package/dist/skins/index.js +1053 -219
  105. package/dist/skins/layout.d.ts +2 -0
  106. package/dist/skins/shell/desktop.d.ts +2 -0
  107. package/dist/skins/shell/embedded.d.ts +2 -0
  108. package/dist/skins/shell/mobile.d.ts +2 -0
  109. package/dist/useLuToast-D5d7Wrcr.js +1029 -0
  110. package/dist/utils.d.ts +0 -11
  111. package/package.json +95 -94
  112. package/src/lumora.css +259 -16
  113. package/dist/LuCodeBlock.vue_vue_type_script_setup_true_lang-BjwcjuXF.js +0 -1623
  114. package/dist/LuOverlay.vue_vue_type_script_setup_true_lang-DZch4Vrw.js +0 -226
  115. package/dist/components/LuThemeSelect.vue.d.ts +0 -2
  116. package/dist/components/LuThemeSwitch.vue.d.ts +0 -2
  117. package/dist/context-0gENwESP.js +0 -62
  118. package/dist/useTheme-Cd4wVaLs.js +0 -21
package/dist/utils.d.ts CHANGED
@@ -8,14 +8,3 @@ export declare function cn(...inputs: ClassValue[]): string;
8
8
  * Extends a base skin with a user skin, intelligently merging Tailwind classes
9
9
  */
10
10
  export declare function extendSkin(baseSkin: SkinMap, userSkin: SkinMap): SkinMap;
11
- /**
12
- * Resolves standard layout props to Tailwind classes statically.
13
- */
14
- export declare function resolveLayoutProps(props: {
15
- gap?: string | number;
16
- padding?: string | number;
17
- align?: 'start' | 'center' | 'end' | 'stretch' | 'baseline';
18
- justify?: 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';
19
- width?: string;
20
- height?: string;
21
- }): string;
package/package.json CHANGED
@@ -1,94 +1,95 @@
1
- {
2
- "name": "@astrake/lumora-ui",
3
- "version": "0.2.1",
4
- "description": "Headless Vue 3 component framework for three surface targets — Mobile, Desktop, and Embedded — with a unified --lu-* design token system.",
5
- "author": "Anuvab Chakraborty (https://github.com/madlybong)",
6
- "license": "MIT",
7
- "type": "module",
8
- "main": "./dist/index.js",
9
- "module": "./dist/index.js",
10
- "types": "./dist/index.d.ts",
11
- "exports": {
12
- ".": {
13
- "types": "./dist/index.d.ts",
14
- "import": "./dist/index.js"
15
- },
16
- "./style": "./src/lumora.css",
17
- "./tailwind": {
18
- "types": "./dist/tailwind.d.ts",
19
- "import": "./dist/tailwind.js"
20
- },
21
- "./layout": {
22
- "types": "./dist/layout/index.d.ts",
23
- "import": "./dist/layout/index.js"
24
- },
25
- "./shell": {
26
- "types": "./dist/shell/index.d.ts",
27
- "import": "./dist/shell/index.js"
28
- },
29
- "./components": {
30
- "types": "./dist/components/index.d.ts",
31
- "import": "./dist/components/index.js"
32
- },
33
- "./composables": {
34
- "types": "./dist/composables/index.d.ts",
35
- "import": "./dist/composables/index.js"
36
- },
37
- "./skins": {
38
- "types": "./dist/skins/index.d.ts",
39
- "import": "./dist/skins/index.js"
40
- }
41
- },
42
- "keywords": [
43
- "vue",
44
- "vue3",
45
- "ui",
46
- "components",
47
- "mobile",
48
- "desktop",
49
- "embedded",
50
- "headless",
51
- "design-tokens",
52
- "lumora",
53
- "astrake",
54
- "typescript"
55
- ],
56
- "repository": {
57
- "type": "git",
58
- "url": "https://github.com/madlybong/LumoraUI.git"
59
- },
60
- "homepage": "https://ui.lumora.astrake.com",
61
- "bugs": {
62
- "url": "https://github.com/madlybong/LumoraUI/issues"
63
- },
64
- "funding": {
65
- "type": "github",
66
- "url": "https://github.com/sponsors/madlybong"
67
- },
68
- "publishConfig": {
69
- "access": "public",
70
- "registry": "https://registry.npmjs.org/"
71
- },
72
- "files": [
73
- "dist",
74
- "src/lumora.css",
75
- "README.md",
76
- "CHANGELOG.md"
77
- ],
78
- "scripts": {
79
- "prepack": "bun run build && bun -e \"await Bun.write('README.md', await Bun.file('../../README.md').text()); await Bun.write('CHANGELOG.md', await Bun.file('../../CHANGELOG.md').text())\"",
80
- "postpack": "bun -e \"import { unlinkSync } from 'fs'; try { unlinkSync('README.md') } catch(e){} try { unlinkSync('CHANGELOG.md') } catch(e){}\"",
81
- "build:types": "bun -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\" && bun run vue-tsc -p tsconfig.build.json",
82
- "build": "bun -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\" && bun run vue-tsc -p tsconfig.build.json && bun run ../../node_modules/vite/bin/vite.js build -c vite.config.ts",
83
- "check": "vue-tsc -p ./tsconfig.json"
84
- },
85
- "peerDependencies": {
86
- "tailwindcss": "^4.0.0",
87
- "vue": "^3.5.0"
88
- },
89
- "dependencies": {
90
- "clsx": "^2.1.1",
91
- "shiki": "^4.0.2",
92
- "tailwind-merge": "^3.5.0"
93
- }
94
- }
1
+ {
2
+ "name": "@astrake/lumora-ui",
3
+ "version": "0.7.2",
4
+ "description": "Headless Vue 3 component framework for three surface targets — Mobile, Desktop, and Embedded — with a unified --lu-* design token system.",
5
+ "author": "Anuvab Chakraborty (https://github.com/madlybong)",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "./dist/index.js",
9
+ "module": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ },
16
+ "./style": "./src/lumora.css",
17
+ "./tailwind": {
18
+ "types": "./dist/tailwind.d.ts",
19
+ "import": "./dist/tailwind.js"
20
+ },
21
+ "./layout": {
22
+ "types": "./dist/layout/index.d.ts",
23
+ "import": "./dist/layout/index.js"
24
+ },
25
+ "./shell": {
26
+ "types": "./dist/shell/index.d.ts",
27
+ "import": "./dist/shell/index.js"
28
+ },
29
+ "./components": {
30
+ "types": "./dist/components/index.d.ts",
31
+ "import": "./dist/components/index.js"
32
+ },
33
+ "./composables": {
34
+ "types": "./dist/composables/index.d.ts",
35
+ "import": "./dist/composables/index.js"
36
+ },
37
+ "./skins": {
38
+ "types": "./dist/skins/index.d.ts",
39
+ "import": "./dist/skins/index.js"
40
+ }
41
+ },
42
+ "keywords": [
43
+ "vue",
44
+ "vue3",
45
+ "ui",
46
+ "components",
47
+ "mobile",
48
+ "desktop",
49
+ "embedded",
50
+ "headless",
51
+ "design-tokens",
52
+ "lumora",
53
+ "astrake",
54
+ "typescript"
55
+ ],
56
+ "repository": {
57
+ "type": "git",
58
+ "url": "https://github.com/madlybong/LumoraUI.git"
59
+ },
60
+ "homepage": "https://ui.lumora.astrake.com",
61
+ "bugs": {
62
+ "url": "https://github.com/madlybong/LumoraUI/issues"
63
+ },
64
+ "funding": {
65
+ "type": "github",
66
+ "url": "https://github.com/sponsors/madlybong"
67
+ },
68
+ "publishConfig": {
69
+ "access": "public",
70
+ "registry": "https://registry.npmjs.org/"
71
+ },
72
+ "files": [
73
+ "dist",
74
+ "src/lumora.css",
75
+ "README.md",
76
+ "CHANGELOG.md"
77
+ ],
78
+ "scripts": {
79
+ "prepack": "bun run build && bun -e \"await Bun.write('README.md', await Bun.file('../../README.md').text()); await Bun.write('CHANGELOG.md', await Bun.file('../../CHANGELOG.md').text())\"",
80
+ "postpack": "bun -e \"import { unlinkSync } from 'fs'; try { unlinkSync('README.md') } catch(e){} try { unlinkSync('CHANGELOG.md') } catch(e){}\"",
81
+ "build:types": "bun -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\" && bun run vue-tsc -p tsconfig.build.json",
82
+ "build": "bun -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\" && bun run vue-tsc -p tsconfig.build.json && bun run ../../node_modules/vite/bin/vite.js build -c vite.config.ts",
83
+ "check": "vue-tsc -p ./tsconfig.json"
84
+ },
85
+ "peerDependencies": {
86
+ "tailwindcss": "^4.0.0",
87
+ "vue": "^3.5.0"
88
+ },
89
+ "dependencies": {
90
+ "@floating-ui/dom": "^1.7.6",
91
+ "clsx": "^2.1.1",
92
+ "shiki": "^4.0.2",
93
+ "tailwind-merge": "^3.5.0"
94
+ }
95
+ }
package/src/lumora.css CHANGED
@@ -1,16 +1,259 @@
1
- /* LumoraUI structural baseline — Tailwind v4 Escape Hatch, v0.1.7+ */
2
- /* Consumers MUST import this: import '@astrake/lumora-ui/style' */
3
-
4
- /*
5
- With the transition to Tailwind v4 as the native design engine,
6
- all structural layout classes (e.g., .lu-button, .lu-stack) have been removed.
7
- Layout structure is now provided by the defaultSkin (`default.ts`) out of the box.
8
-
9
- This file serves as an escape hatch for:
10
- 1. Complex [data-state="..."] selector combinations.
11
- 2. Webkit scrollbar pseudoclasses.
12
- 3. Keyframe animations that Tailwind v4 cannot natively express.
13
- */
14
-
15
- /* Example: Webkit Scrollbar overrides can go here */
16
-
1
+ /* LumoraUI structural baseline — Tailwind v4 Escape Hatch, v0.3.0+ */
2
+ /* Consumers MUST import this: import '@astrake/lumora-ui/style' */
3
+
4
+ /*
5
+ With the transition to Tailwind v4 as the native design engine,
6
+ all structural layout classes (e.g., .lu-button, .lu-stack) have been removed.
7
+ Layout structure is now provided by the defaultSkin (`default.ts`) out of the box.
8
+
9
+ This file serves as an escape hatch for:
10
+ 1. Complex [data-state="..."] selector combinations.
11
+ 2. Webkit scrollbar pseudoclasses.
12
+ 3. Keyframe animations that Tailwind v4 cannot natively express.
13
+ 4. CSS custom property token definitions for semantic pipeline colours.
14
+ */
15
+
16
+ /* ─── Collapsible transition ───────────────────────────────────────────────── */
17
+ .lu-collapsible-enter-active,
18
+ .lu-collapsible-leave-active {
19
+ display: grid;
20
+ transition: grid-template-rows 200ms ease;
21
+ }
22
+ .lu-collapsible-enter-from,
23
+ .lu-collapsible-leave-to {
24
+ grid-template-rows: 0fr;
25
+ }
26
+ .lu-collapsible-enter-to,
27
+ .lu-collapsible-leave-from {
28
+ grid-template-rows: 1fr;
29
+ }
30
+
31
+ /* ─── Easing tokens ────────────────────────────────────────────────────────── */
32
+ :root {
33
+ --lu-ease-spring: cubic-bezier(0.16, 1, 0.3, 1);
34
+ }
35
+
36
+ /* ─── Keyframe animations ──────────────────────────────────────────────────── */
37
+ @keyframes lu-fade-in {
38
+ from {
39
+ opacity: 0;
40
+ transform: scale(0.97) translateY(-3px);
41
+ }
42
+ to {
43
+ opacity: 1;
44
+ transform: scale(1) translateY(0);
45
+ }
46
+ }
47
+
48
+ .lu-fade-in {
49
+ animation: lu-fade-in 130ms var(--lu-ease-spring) forwards;
50
+ }
51
+
52
+ @keyframes lu-slide-down {
53
+ from { opacity: 0; transform: translateY(-6px); }
54
+ to { opacity: 1; transform: translateY(0); }
55
+ }
56
+ .lu-slide-down {
57
+ animation: lu-slide-down 160ms var(--lu-ease-spring) forwards;
58
+ }
59
+
60
+ @keyframes lu-slide-up {
61
+ from { opacity: 0; transform: translateY(6px); }
62
+ to { opacity: 1; transform: translateY(0); }
63
+ }
64
+ .lu-slide-up {
65
+ animation: lu-slide-up 160ms var(--lu-ease-spring) forwards;
66
+ }
67
+
68
+ /* ─── Semantic pipeline colour tokens (Skin v2) ────────────────────────────── */
69
+ :root {
70
+ --lu-pipeline-success: #10b981; /* emerald-500 */
71
+ --lu-pipeline-warning: #f59e0b; /* amber-500 */
72
+ --lu-pipeline-danger: #f43f5e; /* rose-500 */
73
+ --lu-pipeline-info: #3b82f6; /* blue-500 */
74
+ }
75
+
76
+ .dark, [data-theme="dark"] {
77
+ --lu-pipeline-success: #34d399; /* emerald-400 */
78
+ --lu-pipeline-warning: #fbbf24; /* amber-400 */
79
+ --lu-pipeline-danger: #fb7185; /* rose-400 */
80
+ --lu-pipeline-info: #60a5fa; /* blue-400 */
81
+ }
82
+
83
+ /* ─── Timeline connector line ──────────────────────────────────────────────── */
84
+ .lu-timeline-item:not(:last-child) > .lu-timeline-connector {
85
+ position: absolute;
86
+ left: 50%;
87
+ top: 100%;
88
+ transform: translateX(-50%);
89
+ width: 2px;
90
+ height: 100%;
91
+ }
92
+
93
+ /* ─── DataGrid: column freeze (sticky) support ────────────────────────────── */
94
+ .lu-data-grid-cell--frozen,
95
+ .lu-data-grid-header-cell--frozen {
96
+ position: sticky;
97
+ z-index: 2;
98
+ }
99
+
100
+ /* ─── DataGrid: horizontal scroll wrapper ──────────────────────────────────── */
101
+ .lu-data-grid-scroll {
102
+ overflow-x: auto;
103
+ -webkit-overflow-scrolling: touch;
104
+ }
105
+
106
+ /* ─── DataGrid: mobile card collapse (container query) ─────────────────────── */
107
+ @container lu-data-grid (max-width: 600px) {
108
+ .lu-data-grid-table { display: none; }
109
+ .lu-data-grid-cards { display: flex; flex-direction: column; gap: 0.75rem; }
110
+ }
111
+ @container lu-data-grid (min-width: 601px) {
112
+ .lu-data-grid-table { display: table; }
113
+ .lu-data-grid-cards { display: none; }
114
+ }
115
+ .lu-data-grid-container {
116
+ container-type: inline-size;
117
+ container-name: lu-data-grid;
118
+ }
119
+
120
+ /* ─── FormWizard step connector line ───────────────────────────────────────── */
121
+ .lu-form-wizard-step-connector {
122
+ position: absolute;
123
+ top: 50%;
124
+ left: calc(50% + 1rem);
125
+ right: calc(-50% + 1rem);
126
+ height: 2px;
127
+ transform: translateY(-50%);
128
+ }
129
+
130
+ /* ─── Tree indent guide lines ──────────────────────────────────────────────── */
131
+ .lu-tree-node--guide::before {
132
+ content: "";
133
+ position: absolute;
134
+ left: 0;
135
+ top: 0;
136
+ bottom: 0;
137
+ width: 1px;
138
+ background: currentColor;
139
+ opacity: 0.15;
140
+ }
141
+
142
+ /* ─── Command palette backdrop ─────────────────────────────────────────────── */
143
+ .lu-command-palette-overlay {
144
+ animation: lu-fade-in 120ms ease forwards;
145
+ }
146
+
147
+ /* ─── Notification center panel transition ─────────────────────────────────── */
148
+ .lu-notification-panel-enter-active { animation: lu-slide-down 180ms var(--lu-ease-spring) forwards; }
149
+ .lu-notification-panel-leave-active { animation: lu-slide-down 140ms ease reverse forwards; }
150
+
151
+ /* ─── Kanban mobile scroll snap ────────────────────────────────────────────── */
152
+ .lu-kanban-mobile-scroll {
153
+ display: flex;
154
+ overflow-x: auto;
155
+ scroll-snap-type: x mandatory;
156
+ -webkit-overflow-scrolling: touch;
157
+ }
158
+ .lu-kanban-mobile-col {
159
+ scroll-snap-align: start;
160
+ flex: 0 0 100%;
161
+ }
162
+
163
+ /* ─── POS layout: full-screen kiosk ───────────────────────────────────────── */
164
+ .lu-embedded-pos-layout {
165
+ display: grid;
166
+ height: 100dvh;
167
+ width: 100%;
168
+ overflow: hidden;
169
+ }
170
+
171
+ /* ─── POS item list: touch scroll ─────────────────────────────────────────── */
172
+ .lu-embedded-pos-item-list {
173
+ overflow-y: auto;
174
+ -webkit-overflow-scrolling: touch;
175
+ }
176
+
177
+ /* ─── Dashboard grid ───────────────────────────────────────────────────────── */
178
+ .lu-dashboard-grid {
179
+ display: grid;
180
+ gap: 1rem;
181
+ }
182
+
183
+ /* ─── Scrollbar styling (optional, webkit only) ────────────────────────────── */
184
+ .lu-scrollbar-thin::-webkit-scrollbar { width: 4px; height: 4px; }
185
+ .lu-scrollbar-thin::-webkit-scrollbar-track { background: transparent; }
186
+ .lu-scrollbar-thin::-webkit-scrollbar-thumb { border-radius: 9999px; background: rgba(0,0,0,0.15); }
187
+
188
+ /* ─── Drawer Transitions ─────────────────────────────────────────────────── */
189
+ .lu-drawer-fade-enter-active,
190
+ .lu-drawer-fade-leave-active {
191
+ transition: opacity 300ms ease;
192
+ }
193
+ .lu-drawer-fade-enter-from,
194
+ .lu-drawer-fade-leave-to {
195
+ opacity: 0;
196
+ }
197
+
198
+ .lu-drawer-slide-left-enter-active,
199
+ .lu-drawer-slide-left-leave-active,
200
+ .lu-drawer-slide-right-enter-active,
201
+ .lu-drawer-slide-right-leave-active,
202
+ .lu-drawer-slide-top-enter-active,
203
+ .lu-drawer-slide-top-leave-active,
204
+ .lu-drawer-slide-bottom-enter-active,
205
+ .lu-drawer-slide-bottom-leave-active {
206
+ transition: transform 300ms cubic-bezier(0.16, 1, 0.3, 1);
207
+ }
208
+
209
+ .lu-drawer-slide-left-enter-from,
210
+ .lu-drawer-slide-left-leave-to {
211
+ transform: translateX(-100%);
212
+ }
213
+ .lu-drawer-slide-right-enter-from,
214
+ .lu-drawer-slide-right-leave-to {
215
+ transform: translateX(100%);
216
+ }
217
+ .lu-drawer-slide-top-enter-from,
218
+ .lu-drawer-slide-top-leave-to {
219
+ transform: translateY(-100%);
220
+ }
221
+ .lu-drawer-slide-bottom-enter-from,
222
+ .lu-drawer-slide-bottom-leave-to {
223
+ transform: translateY(100%);
224
+ }
225
+
226
+ /* ─── Bottom Sheet Transitions ───────────────────────────────────────────── */
227
+ .lu-bottom-sheet-fade-enter-active,
228
+ .lu-bottom-sheet-fade-leave-active {
229
+ transition: opacity 300ms ease;
230
+ }
231
+ .lu-bottom-sheet-fade-enter-from,
232
+ .lu-bottom-sheet-fade-leave-to {
233
+ opacity: 0;
234
+ }
235
+
236
+ .lu-bottom-sheet-slide-enter-active,
237
+ .lu-bottom-sheet-slide-leave-active {
238
+ transition: transform 300ms cubic-bezier(0.16, 1, 0.3, 1);
239
+ }
240
+ .lu-bottom-sheet-slide-enter-from,
241
+ .lu-bottom-sheet-slide-leave-to {
242
+ transform: translateY(100%);
243
+ }
244
+
245
+ /* ─── Toast Transitions ─────────────────────────────────────────────────── */
246
+ .lu-toast-fade-enter-active,
247
+ .lu-toast-fade-leave-active {
248
+ transition: all 300ms cubic-bezier(0.16, 1, 0.3, 1);
249
+ }
250
+ .lu-toast-fade-enter-from {
251
+ opacity: 0;
252
+ transform: translateY(12px) scale(0.95);
253
+ }
254
+ .lu-toast-fade-leave-to {
255
+ opacity: 0;
256
+ transform: scale(0.95);
257
+ }
258
+
259
+