@ssejal8/recipe-ui-kit 0.1.0 → 0.1.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 (191) hide show
  1. package/README.md +108 -277
  2. package/dist/cjs/index-BEr8BsSA.js +1712 -0
  3. package/dist/cjs/index-BEr8BsSA.js.map +1 -0
  4. package/dist/cjs/index.cjs.js +5 -0
  5. package/dist/cjs/index.cjs.js.map +1 -0
  6. package/dist/cjs/loader.cjs.js +15 -0
  7. package/dist/cjs/loader.cjs.js.map +1 -0
  8. package/dist/cjs/recipe-kit.cjs.js +27 -0
  9. package/dist/cjs/recipe-kit.cjs.js.map +1 -0
  10. package/dist/cjs/rk-badge_10.cjs.entry.js +638 -0
  11. package/dist/cjs/rk-badge_10.cjs.entry.js.map +1 -0
  12. package/dist/collection/collection-manifest.json +22 -0
  13. package/dist/collection/components/rk-badge/rk-badge.js +97 -0
  14. package/dist/collection/components/rk-badge/rk-badge.js.map +1 -0
  15. package/dist/collection/components/rk-chip/rk-chip.js +245 -0
  16. package/dist/collection/components/rk-chip/rk-chip.js.map +1 -0
  17. package/dist/collection/components/rk-empty-state/rk-empty-state.js +138 -0
  18. package/dist/collection/components/rk-empty-state/rk-empty-state.js.map +1 -0
  19. package/dist/collection/components/rk-meal-slot/rk-meal-slot.js +312 -0
  20. package/dist/collection/components/rk-meal-slot/rk-meal-slot.js.map +1 -0
  21. package/dist/collection/components/rk-modal/rk-modal.js +256 -0
  22. package/dist/collection/components/rk-modal/rk-modal.js.map +1 -0
  23. package/dist/collection/components/rk-rating/rk-rating.js +228 -0
  24. package/dist/collection/components/rk-rating/rk-rating.js.map +1 -0
  25. package/dist/collection/components/rk-recipe-card/rk-recipe-card.js +366 -0
  26. package/dist/collection/components/rk-recipe-card/rk-recipe-card.js.map +1 -0
  27. package/dist/collection/components/rk-search-bar/rk-search-bar.js +291 -0
  28. package/dist/collection/components/rk-search-bar/rk-search-bar.js.map +1 -0
  29. package/dist/collection/components/rk-segmented-control/rk-segmented-control.js +196 -0
  30. package/dist/collection/components/rk-segmented-control/rk-segmented-control.js.map +1 -0
  31. package/dist/collection/components/rk-tag-input/rk-tag-input.js +264 -0
  32. package/dist/collection/components/rk-tag-input/rk-tag-input.js.map +1 -0
  33. package/dist/collection/index.js +2 -0
  34. package/dist/collection/index.js.map +1 -0
  35. package/dist/components/index.d.ts +35 -0
  36. package/dist/components/index.js +2 -0
  37. package/dist/components/index.js.map +1 -0
  38. package/dist/components/rk-badge.d.ts +11 -0
  39. package/dist/components/rk-badge.js +2 -0
  40. package/dist/components/rk-badge.js.map +1 -0
  41. package/dist/components/rk-chip.d.ts +11 -0
  42. package/dist/components/rk-chip.js +2 -0
  43. package/dist/components/rk-chip.js.map +1 -0
  44. package/dist/components/rk-empty-state.d.ts +11 -0
  45. package/dist/components/rk-empty-state.js +2 -0
  46. package/dist/components/rk-empty-state.js.map +1 -0
  47. package/dist/components/rk-meal-slot.d.ts +11 -0
  48. package/dist/components/rk-meal-slot.js +2 -0
  49. package/dist/components/rk-meal-slot.js.map +1 -0
  50. package/dist/components/rk-modal.d.ts +11 -0
  51. package/dist/components/rk-modal.js +2 -0
  52. package/dist/components/rk-modal.js.map +1 -0
  53. package/dist/components/rk-rating.d.ts +11 -0
  54. package/dist/components/rk-rating.js +2 -0
  55. package/dist/components/rk-rating.js.map +1 -0
  56. package/dist/components/rk-recipe-card.d.ts +11 -0
  57. package/dist/components/rk-recipe-card.js +2 -0
  58. package/dist/components/rk-recipe-card.js.map +1 -0
  59. package/dist/components/rk-search-bar.d.ts +11 -0
  60. package/dist/components/rk-search-bar.js +2 -0
  61. package/dist/components/rk-search-bar.js.map +1 -0
  62. package/dist/components/rk-segmented-control.d.ts +11 -0
  63. package/dist/components/rk-segmented-control.js +2 -0
  64. package/dist/components/rk-segmented-control.js.map +1 -0
  65. package/dist/components/rk-tag-input.d.ts +11 -0
  66. package/dist/components/rk-tag-input.js +2 -0
  67. package/dist/components/rk-tag-input.js.map +1 -0
  68. package/dist/esm/index-Bxo0C8lB.js +1684 -0
  69. package/dist/esm/index-Bxo0C8lB.js.map +1 -0
  70. package/dist/esm/index.js +4 -0
  71. package/dist/esm/index.js.map +1 -0
  72. package/dist/esm/loader.js +13 -0
  73. package/dist/esm/loader.js.map +1 -0
  74. package/dist/esm/recipe-kit.js +23 -0
  75. package/dist/esm/recipe-kit.js.map +1 -0
  76. package/dist/esm/rk-badge_10.entry.js +627 -0
  77. package/dist/esm/rk-badge_10.entry.js.map +1 -0
  78. package/dist/index.cjs.js +1 -0
  79. package/dist/index.js +1 -0
  80. package/dist/recipe-kit/index.esm.js +2 -0
  81. package/dist/recipe-kit/index.esm.js.map +1 -0
  82. package/dist/recipe-kit/p-Bxo0C8lB.js +3 -0
  83. package/dist/recipe-kit/p-Bxo0C8lB.js.map +1 -0
  84. package/dist/recipe-kit/p-fcb955c7.entry.js +2 -0
  85. package/dist/recipe-kit/p-fcb955c7.entry.js.map +1 -0
  86. package/dist/recipe-kit/recipe-kit.css +1 -0
  87. package/dist/recipe-kit/recipe-kit.esm.js +2 -0
  88. package/dist/recipe-kit/recipe-kit.esm.js.map +1 -0
  89. package/dist/recipe-kit/rk-global.css +104 -0
  90. package/dist/types/components/rk-badge/rk-badge.d.ts +15 -0
  91. package/dist/types/components/rk-chip/rk-chip.d.ts +37 -0
  92. package/dist/types/components/rk-empty-state/rk-empty-state.d.ts +19 -0
  93. package/dist/types/components/rk-meal-slot/rk-meal-slot.d.ts +53 -0
  94. package/dist/types/components/rk-modal/rk-modal.d.ts +41 -0
  95. package/dist/types/components/rk-rating/rk-rating.d.ts +26 -0
  96. package/dist/types/components/rk-recipe-card/rk-recipe-card.d.ts +67 -0
  97. package/dist/types/components/rk-search-bar/rk-search-bar.d.ts +39 -0
  98. package/dist/types/components/rk-segmented-control/rk-segmented-control.d.ts +37 -0
  99. package/dist/types/components/rk-tag-input/rk-tag-input.d.ts +35 -0
  100. package/{packages/recipe-kit-stencil/src → dist/types}/components.d.ts +1 -1
  101. package/{packages/recipe-kit-stencil/src/index.ts → dist/types/index.d.ts} +0 -2
  102. package/dist/types/stencil-public-runtime.d.ts +1873 -0
  103. package/loader/cdn.js +1 -0
  104. package/loader/index.cjs.js +1 -0
  105. package/loader/index.d.ts +24 -0
  106. package/loader/index.es2017.js +1 -0
  107. package/loader/index.js +2 -0
  108. package/package.json +84 -22
  109. package/.claude/settings.local.json +0 -10
  110. package/.npmr +0 -1
  111. package/apps/recipe-web/package.json +0 -31
  112. package/apps/recipe-web/src/app.css +0 -418
  113. package/apps/recipe-web/src/app.d.ts +0 -32
  114. package/apps/recipe-web/src/app.html +0 -25
  115. package/apps/recipe-web/src/lib/api/mealdb.ts +0 -240
  116. package/apps/recipe-web/src/lib/components/AppHeader.svelte +0 -290
  117. package/apps/recipe-web/src/lib/components/ConfirmDialog.svelte +0 -46
  118. package/apps/recipe-web/src/lib/components/Modal.svelte +0 -33
  119. package/apps/recipe-web/src/lib/components/RecipeCard.svelte +0 -100
  120. package/apps/recipe-web/src/lib/components/RecipeForm.svelte +0 -560
  121. package/apps/recipe-web/src/lib/components/RecipeGrid.svelte +0 -77
  122. package/apps/recipe-web/src/lib/components/RecipePickerDialog.svelte +0 -185
  123. package/apps/recipe-web/src/lib/components/Toaster.svelte +0 -111
  124. package/apps/recipe-web/src/lib/domain/recipe.ts +0 -130
  125. package/apps/recipe-web/src/lib/domain/validation.ts +0 -189
  126. package/apps/recipe-web/src/lib/stencil/WebComponent.svelte +0 -145
  127. package/apps/recipe-web/src/lib/stencil/register.ts +0 -28
  128. package/apps/recipe-web/src/lib/stores/favorites.svelte.ts +0 -81
  129. package/apps/recipe-web/src/lib/stores/myRecipes.svelte.ts +0 -98
  130. package/apps/recipe-web/src/lib/stores/persisted.svelte.ts +0 -73
  131. package/apps/recipe-web/src/lib/stores/planner.svelte.ts +0 -275
  132. package/apps/recipe-web/src/lib/stores/theme.svelte.ts +0 -67
  133. package/apps/recipe-web/src/lib/stores/toast.svelte.ts +0 -66
  134. package/apps/recipe-web/src/routes/+error.svelte +0 -36
  135. package/apps/recipe-web/src/routes/+layout.svelte +0 -62
  136. package/apps/recipe-web/src/routes/+page.svelte +0 -352
  137. package/apps/recipe-web/src/routes/+page.ts +0 -107
  138. package/apps/recipe-web/src/routes/favorites/+page.svelte +0 -170
  139. package/apps/recipe-web/src/routes/my-recipes/+layout.ts +0 -55
  140. package/apps/recipe-web/src/routes/my-recipes/+page.svelte +0 -180
  141. package/apps/recipe-web/src/routes/my-recipes/[id]/edit/+page.svelte +0 -104
  142. package/apps/recipe-web/src/routes/my-recipes/new/+page.svelte +0 -67
  143. package/apps/recipe-web/src/routes/planner/+page.svelte +0 -422
  144. package/apps/recipe-web/src/routes/recipes/[id]/+page.svelte +0 -538
  145. package/apps/recipe-web/src/routes/recipes/[id]/+page.ts +0 -24
  146. package/apps/recipe-web/static/favicon.svg +0 -8
  147. package/apps/recipe-web/static/robots.txt +0 -2
  148. package/apps/recipe-web/svelte.config.js +0 -35
  149. package/apps/recipe-web/tsconfig.json +0 -14
  150. package/apps/recipe-web/vite.config.ts +0 -23
  151. package/packages/recipe-kit-stencil/README.md +0 -185
  152. package/packages/recipe-kit-stencil/package-lock.json +0 -4772
  153. package/packages/recipe-kit-stencil/package.json +0 -91
  154. package/packages/recipe-kit-stencil/src/components/rk-badge/readme.md +0 -38
  155. package/packages/recipe-kit-stencil/src/components/rk-badge/rk-badge.tsx +0 -31
  156. package/packages/recipe-kit-stencil/src/components/rk-chip/readme.md +0 -52
  157. package/packages/recipe-kit-stencil/src/components/rk-chip/rk-chip.tsx +0 -105
  158. package/packages/recipe-kit-stencil/src/components/rk-empty-state/readme.md +0 -44
  159. package/packages/recipe-kit-stencil/src/components/rk-empty-state/rk-empty-state.tsx +0 -50
  160. package/packages/recipe-kit-stencil/src/components/rk-meal-slot/readme.md +0 -58
  161. package/packages/recipe-kit-stencil/src/components/rk-meal-slot/rk-meal-slot.tsx +0 -182
  162. package/packages/recipe-kit-stencil/src/components/rk-modal/readme.md +0 -57
  163. package/packages/recipe-kit-stencil/src/components/rk-modal/rk-modal.tsx +0 -176
  164. package/packages/recipe-kit-stencil/src/components/rk-rating/readme.md +0 -42
  165. package/packages/recipe-kit-stencil/src/components/rk-rating/rk-rating.tsx +0 -114
  166. package/packages/recipe-kit-stencil/src/components/rk-recipe-card/readme.md +0 -66
  167. package/packages/recipe-kit-stencil/src/components/rk-recipe-card/rk-recipe-card.tsx +0 -179
  168. package/packages/recipe-kit-stencil/src/components/rk-recipe-card/test/rk-recipe-card.spec.tsx +0 -70
  169. package/packages/recipe-kit-stencil/src/components/rk-search-bar/readme.md +0 -67
  170. package/packages/recipe-kit-stencil/src/components/rk-search-bar/rk-search-bar.tsx +0 -152
  171. package/packages/recipe-kit-stencil/src/components/rk-search-bar/test/rk-search-bar.spec.tsx +0 -93
  172. package/packages/recipe-kit-stencil/src/components/rk-segmented-control/readme.md +0 -41
  173. package/packages/recipe-kit-stencil/src/components/rk-segmented-control/rk-segmented-control.tsx +0 -115
  174. package/packages/recipe-kit-stencil/src/components/rk-tag-input/readme.md +0 -47
  175. package/packages/recipe-kit-stencil/src/components/rk-tag-input/rk-tag-input.tsx +0 -181
  176. package/packages/recipe-kit-stencil/src/components/rk-tag-input/test/rk-tag-input.spec.tsx +0 -76
  177. package/packages/recipe-kit-stencil/src/index.html +0 -259
  178. package/packages/recipe-kit-stencil/stencil.config.ts +0 -41
  179. package/packages/recipe-kit-stencil/tsconfig.json +0 -24
  180. /package/{packages/recipe-kit-stencil/LICENSE → LICENSE} +0 -0
  181. /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-badge/rk-badge.css +0 -0
  182. /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-chip/rk-chip.css +0 -0
  183. /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-empty-state/rk-empty-state.css +0 -0
  184. /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-meal-slot/rk-meal-slot.css +0 -0
  185. /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-modal/rk-modal.css +0 -0
  186. /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-rating/rk-rating.css +0 -0
  187. /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-recipe-card/rk-recipe-card.css +0 -0
  188. /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-search-bar/rk-search-bar.css +0 -0
  189. /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-segmented-control/rk-segmented-control.css +0 -0
  190. /package/{packages/recipe-kit-stencil/src → dist/collection}/components/rk-tag-input/rk-tag-input.css +0 -0
  191. /package/{packages/recipe-kit-stencil/src/global → dist/collection}/rk-global.css +0 -0
package/loader/cdn.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('../dist/cjs/loader.cjs.js');
@@ -0,0 +1 @@
1
+ module.exports = require('../dist/cjs/loader.cjs.js');
@@ -0,0 +1,24 @@
1
+ export * from '../dist/types/components';
2
+ export interface CustomElementsDefineOptions {
3
+ exclude?: string[];
4
+ resourcesUrl?: string;
5
+ syncQueue?: boolean;
6
+ jmp?: (c: Function) => any;
7
+ raf?: (c: FrameRequestCallback) => number;
8
+ ael?: (el: EventTarget, eventName: string, listener: EventListenerOrEventListenerObject, options: boolean | AddEventListenerOptions) => void;
9
+ rel?: (el: EventTarget, eventName: string, listener: EventListenerOrEventListenerObject, options: boolean | AddEventListenerOptions) => void;
10
+ }
11
+ export declare function defineCustomElements(win?: Window, opts?: CustomElementsDefineOptions): Promise<void>;
12
+ /**
13
+ * @deprecated
14
+ */
15
+ export declare function applyPolyfills(): Promise<void>;
16
+
17
+ /**
18
+ * Used to specify a nonce value that corresponds with an application's CSP.
19
+ * When set, the nonce will be added to all dynamically created script and style tags at runtime.
20
+ * Alternatively, the nonce value can be set on a meta tag in the DOM head
21
+ * (<meta name="csp-nonce" content="{ nonce value here }" />) which
22
+ * will result in the same behavior.
23
+ */
24
+ export declare function setNonce(nonce: string): void;
@@ -0,0 +1 @@
1
+ export * from '../dist/esm/loader.js';
@@ -0,0 +1,2 @@
1
+ (function(){if("undefined"!==typeof window&&void 0!==window.Reflect&&void 0!==window.customElements){var a=HTMLElement;window.HTMLElement=function(){return Reflect.construct(a,[],this.constructor)};HTMLElement.prototype=a.prototype;HTMLElement.prototype.constructor=HTMLElement;Object.setPrototypeOf(HTMLElement,a)}})();
2
+ export * from '../dist/esm/loader.js';
package/package.json CHANGED
@@ -1,29 +1,91 @@
1
1
  {
2
2
  "name": "@ssejal8/recipe-ui-kit",
3
- "publishConfig": {
4
- "registry": "https://registry.npmjs.org/",
5
- "access": "public"
6
- },
7
- "version": "0.1.0",
8
- "description": "Recipe Finder & Meal Planner — SvelteKit application plus a published StencilJS component library.",
3
+ "version": "0.1.1",
4
+ "description": "Framework-agnostic web component library (StencilJS) for recipe discovery, favorites and meal planning UIs.",
5
+ "license": "MIT",
6
+ "author": "Sejal Sharma",
7
+ "keywords": [
8
+ "stencil",
9
+ "stenciljs",
10
+ "web-components",
11
+ "custom-elements",
12
+ "design-system",
13
+ "recipe",
14
+ "meal-planner",
15
+ "svelte",
16
+ "sveltekit"
17
+ ],
9
18
  "type": "module",
10
- "workspaces": [
11
- "packages/*",
12
- "apps/*"
19
+ "main": "dist/index.cjs.js",
20
+ "module": "dist/index.js",
21
+ "types": "dist/types/index.d.ts",
22
+ "collection": "dist/collection/collection-manifest.json",
23
+ "collection:main": "dist/collection/index.js",
24
+ "unpkg": "dist/recipe-kit/recipe-kit.esm.js",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/types/index.d.ts",
28
+ "import": "./dist/index.js",
29
+ "require": "./dist/index.cjs.js"
30
+ },
31
+ "./loader": {
32
+ "types": "./loader/index.d.ts",
33
+ "import": "./loader/index.js",
34
+ "require": "./loader/index.cjs.js"
35
+ },
36
+ "./components/*": {
37
+ "types": "./dist/components/*.d.ts",
38
+ "import": "./dist/components/*.js"
39
+ },
40
+ "./dist/recipe-kit/recipe-kit.css": "./dist/recipe-kit/recipe-kit.css",
41
+ "./styles": "./dist/recipe-kit/recipe-kit.css",
42
+ "./dist/*": "./dist/*",
43
+ "./package.json": "./package.json"
44
+ },
45
+ "files": [
46
+ "dist/",
47
+ "loader/",
48
+ "README.md",
49
+ "LICENSE"
50
+ ],
51
+ "sideEffects": [
52
+ "dist/**/*.css",
53
+ "dist/esm/polyfills/*"
13
54
  ],
14
- "engines": {
15
- "node": ">=20"
55
+ "publishConfig": {
56
+ "access": "public",
57
+ "registry": "https://registry.npmjs.org/"
16
58
  },
17
59
  "scripts": {
18
- "dev": "npm run build --workspace recipe-kit-stencil && npm run dev --workspace recipe-web",
19
- "dev:app": "npm run dev --workspace recipe-web",
20
- "dev:kit": "npm run start --workspace recipe-kit-stencil",
21
- "build": "npm run build --workspace recipe-kit-stencil && npm run build --workspace recipe-web",
22
- "build:kit": "npm run build --workspace recipe-kit-stencil",
23
- "build:app": "npm run build --workspace recipe-web",
24
- "preview": "npm run preview --workspace recipe-web",
25
- "check": "npm run check --workspace recipe-web",
26
- "test": "npm run test --workspace recipe-kit-stencil",
27
- "publish:kit": "npm publish --workspace recipe-kit-stencil"
28
- }
60
+ "build": "stencil build --docs",
61
+ "start": "stencil build --dev --watch --serve",
62
+ "test": "stencil test --spec",
63
+ "test:watch": "stencil test --spec --watchAll",
64
+ "generate": "stencil generate",
65
+ "clean": "rimraf dist loader www .stencil",
66
+ "prepare": "stencil build",
67
+ "prepublishOnly": "npm run clean && npm run build",
68
+ "release:patch": "npm version patch && npm publish",
69
+ "release:minor": "npm version minor && npm publish",
70
+ "release:major": "npm version major && npm publish"
71
+ },
72
+ "dependencies": {
73
+ "@stencil/core": "^4.44.1"
74
+ },
75
+ "devDependencies": {
76
+ "@types/jest": "^29.5.14",
77
+ "jest": "^29.7.0",
78
+ "jest-cli": "^29.7.0",
79
+ "puppeteer": "^24.10.2",
80
+ "rimraf": "^6.0.1"
81
+ },
82
+ "repository": {
83
+ "type": "git",
84
+ "url": "git+https://github.com/sejal-sharma/recipe-ui.git",
85
+ "directory": "packages/recipe-ui-kit"
86
+ },
87
+ "bugs": {
88
+ "url": "https://github.com/sejal-sharma/recipe-ui/issues"
89
+ },
90
+ "homepage": "https://github.com/sejal-sharma/recipe-ui/tree/main/packages/recipe-ui-kit#readme"
29
91
  }
@@ -1,10 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(npm -v)",
5
- "Bash(git --version)",
6
- "Bash(npm whoami *)",
7
- "Bash(npx stencil *)"
8
- ]
9
- }
10
- }
package/.npmr DELETED
@@ -1 +0,0 @@
1
- registry=https://registry.npmjs.org/
@@ -1,31 +0,0 @@
1
- {
2
- "name": "recipe-web",
3
- "private": true,
4
- "version": "0.1.0",
5
- "description": "Recipe Finder & Meal Planner — SvelteKit 5 application.",
6
- "type": "module",
7
- "scripts": {
8
- "dev": "vite dev",
9
- "build": "vite build",
10
- "build:node": "ADAPTER=node vite build",
11
- "preview": "vite preview",
12
- "preview:node": "ADAPTER=node vite build && node build/index.js",
13
- "start": "node build/index.js",
14
- "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
15
- "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
16
- "prepare": "svelte-kit sync"
17
- },
18
- "dependencies": {
19
- "recipe-kit-stencil": "^0.1.0"
20
- },
21
- "devDependencies": {
22
- "@sveltejs/adapter-auto": "^7.0.1",
23
- "@sveltejs/adapter-node": "^5.5.7",
24
- "@sveltejs/kit": "^2.70.3",
25
- "@sveltejs/vite-plugin-svelte": "^7.3.0",
26
- "svelte": "^5.56.10",
27
- "svelte-check": "^4.7.6",
28
- "typescript": "^5.9.3",
29
- "vite": "^8.2.2"
30
- }
31
- }
@@ -1,418 +0,0 @@
1
- /*
2
- * Application shell styles.
3
- *
4
- * The `--rk-*` tokens come from recipe-kit-stencil's stylesheet and are the
5
- * single source of truth for colour, radius and elevation. The app maps them to
6
- * shorter `--app-*` aliases and adds only what the shell itself needs, so the
7
- * Svelte chrome and the web components can never drift apart visually.
8
- */
9
-
10
- :root {
11
- --app-max: 1180px;
12
- --app-gutter: clamp(16px, 4vw, 40px);
13
- --app-header-h: 66px;
14
- }
15
-
16
- *,
17
- *::before,
18
- *::after {
19
- box-sizing: border-box;
20
- }
21
-
22
- html {
23
- -webkit-text-size-adjust: 100%;
24
- scroll-behavior: smooth;
25
- }
26
-
27
- @media (prefers-reduced-motion: reduce) {
28
- html {
29
- scroll-behavior: auto;
30
- }
31
- }
32
-
33
- body {
34
- margin: 0;
35
- min-height: 100vh;
36
- background: var(--rk-bg);
37
- color: var(--rk-ink);
38
- font-family: var(--rk-font);
39
- font-size: 15px;
40
- line-height: 1.6;
41
- -webkit-font-smoothing: antialiased;
42
- text-rendering: optimizeLegibility;
43
- }
44
-
45
- h1,
46
- h2,
47
- h3,
48
- h4 {
49
- font-family: var(--rk-font-display);
50
- letter-spacing: -0.02em;
51
- line-height: 1.2;
52
- margin: 0;
53
- font-weight: 650;
54
- }
55
-
56
- p {
57
- margin: 0;
58
- }
59
-
60
- a {
61
- color: var(--rk-primary);
62
- text-decoration-thickness: 1px;
63
- text-underline-offset: 2px;
64
- }
65
-
66
- img {
67
- max-width: 100%;
68
- }
69
-
70
- :focus-visible {
71
- outline: none;
72
- box-shadow: var(--rk-focus-ring);
73
- border-radius: var(--rk-radius-sm);
74
- }
75
-
76
- /* ------------------------------------------------------------------ layout */
77
-
78
- .shell {
79
- display: flex;
80
- flex-direction: column;
81
- min-height: 100vh;
82
- }
83
-
84
- .page {
85
- flex: 1 1 auto;
86
- width: 100%;
87
- max-width: var(--app-max);
88
- margin: 0 auto;
89
- padding: clamp(24px, 4vw, 44px) var(--app-gutter) 88px;
90
- }
91
-
92
- .page-head {
93
- display: flex;
94
- flex-wrap: wrap;
95
- align-items: flex-end;
96
- justify-content: space-between;
97
- gap: 16px 24px;
98
- margin-bottom: 26px;
99
- }
100
-
101
- .page-title {
102
- font-size: clamp(1.7rem, 4vw, 2.35rem);
103
- }
104
-
105
- .page-lede {
106
- margin-top: 7px;
107
- color: var(--rk-muted);
108
- max-width: 62ch;
109
- }
110
-
111
- .eyebrow {
112
- font-size: 0.72rem;
113
- font-weight: 700;
114
- letter-spacing: 0.1em;
115
- text-transform: uppercase;
116
- color: var(--rk-primary);
117
- margin-bottom: 8px;
118
- }
119
-
120
- .section {
121
- margin-top: 44px;
122
- }
123
-
124
- .section-head {
125
- display: flex;
126
- flex-wrap: wrap;
127
- align-items: baseline;
128
- justify-content: space-between;
129
- gap: 12px;
130
- margin-bottom: 16px;
131
- padding-bottom: 10px;
132
- border-bottom: 1px solid var(--rk-border);
133
- }
134
-
135
- .section-title {
136
- font-size: 1.15rem;
137
- }
138
-
139
- .muted {
140
- color: var(--rk-muted);
141
- }
142
-
143
- .small {
144
- font-size: 0.87rem;
145
- }
146
-
147
- .stack {
148
- display: grid;
149
- gap: 14px;
150
- }
151
-
152
- .row {
153
- display: flex;
154
- flex-wrap: wrap;
155
- align-items: center;
156
- gap: 10px;
157
- }
158
-
159
- .card-surface {
160
- background: var(--rk-surface);
161
- border: 1px solid var(--rk-border);
162
- border-radius: var(--rk-radius-lg);
163
- padding: clamp(18px, 3vw, 26px);
164
- box-shadow: var(--rk-shadow-sm);
165
- }
166
-
167
- .recipe-grid {
168
- display: grid;
169
- grid-template-columns: repeat(auto-fill, minmax(232px, 1fr));
170
- gap: clamp(14px, 2vw, 22px);
171
- }
172
-
173
- /* ------------------------------------------------------------------ buttons */
174
-
175
- .btn {
176
- display: inline-flex;
177
- align-items: center;
178
- justify-content: center;
179
- gap: 8px;
180
- padding: 10px 18px;
181
- border-radius: var(--rk-radius-pill);
182
- border: 1px solid var(--rk-border);
183
- background: var(--rk-surface);
184
- color: var(--rk-ink);
185
- font: inherit;
186
- font-size: 0.9rem;
187
- font-weight: 600;
188
- line-height: 1.2;
189
- cursor: pointer;
190
- text-decoration: none;
191
- white-space: nowrap;
192
- transition:
193
- background var(--rk-transition),
194
- border-color var(--rk-transition),
195
- color var(--rk-transition),
196
- transform var(--rk-transition);
197
- }
198
-
199
- .btn:hover:not(:disabled) {
200
- border-color: var(--rk-border-strong);
201
- background: var(--rk-surface-2);
202
- }
203
-
204
- .btn:active:not(:disabled) {
205
- transform: translateY(1px);
206
- }
207
-
208
- .btn:disabled {
209
- opacity: 0.5;
210
- cursor: not-allowed;
211
- }
212
-
213
- .btn-primary {
214
- background: var(--rk-primary);
215
- border-color: var(--rk-primary);
216
- color: #fff;
217
- }
218
-
219
- .btn-primary:hover:not(:disabled) {
220
- background: var(--rk-primary-strong);
221
- border-color: var(--rk-primary-strong);
222
- color: #fff;
223
- }
224
-
225
- .btn-accent {
226
- background: var(--rk-accent);
227
- border-color: var(--rk-accent);
228
- color: #fff;
229
- }
230
-
231
- .btn-accent:hover:not(:disabled) {
232
- filter: brightness(1.1);
233
- color: #fff;
234
- }
235
-
236
- .btn-danger {
237
- background: transparent;
238
- border-color: var(--rk-danger);
239
- color: var(--rk-danger);
240
- }
241
-
242
- .btn-danger:hover:not(:disabled) {
243
- background: var(--rk-danger);
244
- border-color: var(--rk-danger);
245
- color: #fff;
246
- }
247
-
248
- .btn-ghost {
249
- background: transparent;
250
- border-color: transparent;
251
- color: var(--rk-ink-2);
252
- }
253
-
254
- .btn-ghost:hover:not(:disabled) {
255
- background: var(--rk-surface-2);
256
- border-color: transparent;
257
- }
258
-
259
- .btn-sm {
260
- padding: 7px 13px;
261
- font-size: 0.83rem;
262
- }
263
-
264
- .btn-block {
265
- width: 100%;
266
- }
267
-
268
- .btn svg {
269
- width: 16px;
270
- height: 16px;
271
- flex: 0 0 auto;
272
- }
273
-
274
- /* ------------------------------------------------------------------- forms */
275
-
276
- .field {
277
- display: grid;
278
- gap: 7px;
279
- }
280
-
281
- .field-label {
282
- font-size: 0.88rem;
283
- font-weight: 600;
284
- color: var(--rk-ink-2);
285
- display: flex;
286
- align-items: center;
287
- justify-content: space-between;
288
- gap: 10px;
289
- }
290
-
291
- .field-req {
292
- color: var(--rk-primary);
293
- }
294
-
295
- .input,
296
- .select,
297
- .textarea {
298
- width: 100%;
299
- padding: 11px 13px;
300
- border: 1px solid var(--rk-border);
301
- border-radius: var(--rk-radius);
302
- background: var(--rk-surface);
303
- color: var(--rk-ink);
304
- font: inherit;
305
- transition:
306
- border-color var(--rk-transition),
307
- box-shadow var(--rk-transition);
308
- }
309
-
310
- .textarea {
311
- resize: vertical;
312
- min-height: 82px;
313
- line-height: 1.55;
314
- }
315
-
316
- .select {
317
- appearance: none;
318
- background-image: linear-gradient(45deg, transparent 50%, currentColor 50%), linear-gradient(135deg, currentColor 50%, transparent 50%);
319
- background-position:
320
- calc(100% - 19px) calc(50% + 2px),
321
- calc(100% - 14px) calc(50% + 2px);
322
- background-size:
323
- 5px 5px,
324
- 5px 5px;
325
- background-repeat: no-repeat;
326
- padding-right: 36px;
327
- cursor: pointer;
328
- }
329
-
330
- .input:focus,
331
- .select:focus,
332
- .textarea:focus {
333
- outline: none;
334
- border-color: var(--rk-primary);
335
- box-shadow: var(--rk-focus-ring);
336
- }
337
-
338
- .input[aria-invalid='true'],
339
- .select[aria-invalid='true'],
340
- .textarea[aria-invalid='true'] {
341
- border-color: var(--rk-danger);
342
- }
343
-
344
- .field-error {
345
- font-size: 0.83rem;
346
- font-weight: 550;
347
- color: var(--rk-danger);
348
- }
349
-
350
- .field-hint {
351
- font-size: 0.83rem;
352
- color: var(--rk-muted);
353
- }
354
-
355
- .field-grid {
356
- display: grid;
357
- gap: 16px;
358
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
359
- }
360
-
361
- /* ------------------------------------------------------------------ effects */
362
-
363
- .skeleton {
364
- background: linear-gradient(90deg, var(--rk-surface-2) 25%, var(--rk-border) 50%, var(--rk-surface-2) 75%);
365
- background-size: 200% 100%;
366
- animation: shimmer 1.4s ease-in-out infinite;
367
- border-radius: var(--rk-radius);
368
- }
369
-
370
- @keyframes shimmer {
371
- from {
372
- background-position: 200% 0;
373
- }
374
- to {
375
- background-position: -200% 0;
376
- }
377
- }
378
-
379
- @media (prefers-reduced-motion: reduce) {
380
- .skeleton {
381
- animation: none;
382
- }
383
- .btn {
384
- transition: none;
385
- }
386
- }
387
-
388
- .sr-only {
389
- position: absolute;
390
- width: 1px;
391
- height: 1px;
392
- padding: 0;
393
- margin: -1px;
394
- overflow: hidden;
395
- clip: rect(0, 0, 0, 0);
396
- white-space: nowrap;
397
- border: 0;
398
- }
399
-
400
- /* Skip link, revealed on focus. */
401
- .skip-link {
402
- position: absolute;
403
- top: 8px;
404
- left: 8px;
405
- z-index: 1200;
406
- padding: 10px 16px;
407
- background: var(--rk-ink);
408
- color: var(--rk-bg);
409
- border-radius: var(--rk-radius-pill);
410
- font-weight: 600;
411
- text-decoration: none;
412
- transform: translateY(-200%);
413
- transition: transform var(--rk-transition);
414
- }
415
-
416
- .skip-link:focus {
417
- transform: translateY(0);
418
- }
@@ -1,32 +0,0 @@
1
- // See https://svelte.dev/docs/kit/types#app
2
- declare global {
3
- namespace App {
4
- // interface Error {}
5
- // interface Locals {}
6
- // interface PageData {}
7
- // interface PageState {}
8
- // interface Platform {}
9
- }
10
-
11
- /**
12
- * The `rk-*` tags are registered at runtime by `recipe-kit-stencil`. Declaring
13
- * them here stops `svelte-check` from treating them as typos while still
14
- * allowing arbitrary props, which the `WebComponent` bridge assigns directly.
15
- */
16
- namespace svelteHTML {
17
- interface IntrinsicElements {
18
- 'rk-search-bar': Record<string, unknown>;
19
- 'rk-chip': Record<string, unknown>;
20
- 'rk-segmented-control': Record<string, unknown>;
21
- 'rk-recipe-card': Record<string, unknown>;
22
- 'rk-rating': Record<string, unknown>;
23
- 'rk-badge': Record<string, unknown>;
24
- 'rk-tag-input': Record<string, unknown>;
25
- 'rk-meal-slot': Record<string, unknown>;
26
- 'rk-modal': Record<string, unknown>;
27
- 'rk-empty-state': Record<string, unknown>;
28
- }
29
- }
30
- }
31
-
32
- export {};
@@ -1,25 +0,0 @@
1
- <!doctype html>
2
- <html lang="en" data-theme="light">
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <meta name="theme-color" content="#d94f1b" />
7
- <meta name="description" content="Discover recipes, build your own collection, and plan your week — a Recipe Finder & Meal Planner." />
8
- <link rel="icon" href="%sveltekit.assets%/favicon.svg" type="image/svg+xml" />
9
- <link rel="preconnect" href="https://www.themealdb.com" crossorigin />
10
- <script>
11
- // Applied before first paint so a dark-mode user never sees a light flash.
12
- try {
13
- const stored = localStorage.getItem('recipe-ui:theme:v1');
14
- const theme = stored ? JSON.parse(stored) : null;
15
- const resolved = theme ?? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
16
- document.documentElement.dataset.theme = resolved;
17
- document.documentElement.dataset.rkTheme = resolved;
18
- } catch {}
19
- </script>
20
- %sveltekit.head%
21
- </head>
22
- <body data-sveltekit-preload-data="hover">
23
- <div style="display: contents">%sveltekit.body%</div>
24
- </body>
25
- </html>